(1)普通函数申明
function t(){
console.log(this)
}
t();//window
var tt={};
tt.x=t;
tt.x();//tt this指向当前调用对象
function tt(){
return function(){ console.log(this)}
}
tt()(); //window
function t(t=function(){console.log(this)}){t()}
t(); //window
(2)箭头函数
var t=()=>{console.log(this)}
t();//window;
var tt={};
tt.x=t;
tt.x();//window 箭头函数 this指向当前作用域
var t={x:()=>{console.log(this)},y:function(){ console.log(this)}}
t.x();//window 因为箭头函数本身没有this 他的this指向当前作用域, 而创建obj的时候并无作用域,所以指向 window
t.y();// t 普通方法的this是延迟绑定的,指向当前调用对象,
t.y.call(null); t.y.call(window); // 都是window
var t={x:function(call){call()}}
t.x(()=>{console.log(this)})// window 箭头函数它并不延迟绑定,指向的作用域依旧是window
继续:
var t={ x: function(){ return ()=>{console.log(this)} } }
var tt={y:1}
t.x.call(tt); // this == tt , why? x是普通函数, 他的this指向tt , x返回的箭头函数寻找外层作用域中的this 找到的是 x 的作用域,也就是tt的 this
es6中的一个例子:
function foo() {
return () => {
return () => {
return () => {
console.log(this);
};
};
};
}
foo()()()();//window
var t=new foo();
t()()();//foo
(3)类
class T{
t(){
console.log(this);
};
}
var t=new T();
t.t();//T
由于this的延迟绑定, 所以方法或函数执行时才会绑定this,所以我理解的是:如果call 、apply 到null 上面,等同于全局作用域中申明函数一样,this 指向window。
function t(){ console.log(this)}
t.call(null);
// this== window
var t={ tt:function(){console.log(this)}}
t.tt.call(null);
//this ==window