this:this的指向,看具体怎么调用。
this的四种绑定规则:默认绑定,隐式绑定,显式绑定,new绑定。 优先级从低到高。
1.默认规则,默认绑定window。
function a(){
console.log(this.test);
}
var test = 7;
a(); //7
2.隐式绑定,多层调用链,就近原则,上下文对象。
function a(){
console.log(this.b)
}
var b = 2;
var obj={
b:3,
a:a
}
obj.a() //3
//多层调用
function a(){
console.log(this.b)
}
var a = 2;
var obj={
b:3,
a:a
};
var obj ={
b:4,
obj:obj
};
obj1.obj.a(); // 4
//隐式中需要注意的(使用的还是默认绑定)
//obj.a 是引用属性,赋值给foo的实际上就是a函数
1.
function a(){
console.log(this.b)
}
var b =2;
var obj ={
b:3,
a:a
};
var foo = obj.a;
foo()// 2
2.
function a(){
console.log(this.b)
}
var b =2;
var obj ={
b:3,
a:a
};
setTimeOut(obj.a , 1000) //2
3.显式绑定,避免动态变化,绑定到指定对象 ,call(obj,{}),apply(obj,arr)
function a(){
console.log(this.b)
}
var b =2;
var obj ={
b:3
}
var obj1 ={
b:4
}
a.call(obj);
a.apply(obj1);
4.new绑定,如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。
function a(){
console.log(this.b)
}
var b =2;
var c = new a(3)
c.a //3
var d = new a(4)
d.a // 4
5.绑定优先级的规则。
new(new新创建的对象)->显式绑定(call,apply中指定的对象)->隐式绑定(上下文对象)->默认绑定(非严格模式下,为全局对象,否则为undefined)。
6.箭头函数,this的绑定只取决与外层(函数或全局)作用域,显式绑定在箭头函数中不生效
1.
var a = () => {
console.log( this.b );
}
var b = 2;
var obj = {
b: 3,
a: a
};
obj.a(); //2
a.call(obj); //2 ,箭头函数中显示绑定不会生效
2.
function a(){
return () => {
console.log( this.b );
}
}
var b = 2;
var obj = {
b: 3,
a: a
};
var c = obj.a();
c(); //3