this绑定的四种规则
默认绑定
全局调用函数
- 在非严格模式下,全局调用函数,此时的
this指向window - 当函数独立调用时,
this指向window
console.log(this === window);
funtion test(){
console.log(this === window);比较此时的this和window 的关系
}
test();
- 在严格模式下
use strict ,全局调用函数,此时的this指向undefined
'use strict';
console.log(this === window);
function test() {
console.log(this);
}
test();
隐式绑定
作为对象的方法调用
- 当函数作为一个对象的属性即方法时,例如
obj.test() ,这种调用方式是,函数内部的this指向该调用对象 - 可以归纳为谁调用指向谁
var obj = {
test: function () {
console.log(this);
console.log(this === obj);
}
}
obj.test();
立即执行函数
- 在非严格模式下的立即执行函数
this指向window - 当函数内部嵌套一个立即执行函数时,立即执行函数的
this指向window - 严格模式下和立即执行函数的
this指向undefined
我把两种写立即函数的方式都写在同一个函数里面,推荐写第二种方式写立即执行函数。
var obj = {
test: function () {
console.log("测试!!");
(function fun() {
console.log(this);
console.log(this === window);
})();
}
}
obj.test();
闭包函数
- 在非严格模式下,当函数闭包产生的独立调用,
this指向window - 在严格模式下
this指向undefined
var obj = {
test: function () {
console.log("测试!!");
function fun() {
console.log(this);
console.log(this === window);
}
return fun;
}
}
obj.test()();
隐式丢失
- 当函数方法进行赋值操作,会有个隐式丢失的现象,这种情况也是独立调用,
this指向window
function fun1(){
console.log(this);
console.log(this===window);
}
var obj = {
fun2: fun1
};
var test = obj.fun2;
test();
函数作为参数
- 当函数方法作为参数时,编译过程中,实参被赋值为形参;方法在内部也是独立调用,
this指向window
function fun1() {
console.log(this);
}
function test(fun) {
fun();
}
var obj = {
fun1: fun1
};
test(obj.fun1);
显示绑定
call , apply , bind
- 通过
call , apply , bind 强制绑定this指向对象
function fun() {
console.log(this);
}
var obj = {
a: 2,
fun: fun
};
obj.fun();
var test = obj.fun;
test.call(obj)
test.apply(obj)
test.bind(obj)()
new绑定
- 当使用new来使用一个函数,函数就会变成构造函数,产生出一个新的实例对象,返回的
this指向实例对象
function Person(){
this.name = "1"
return this
}
var test = new Person();
console.log(test);
this绑定的四种优先级
|