this指向函数作用域 yes or no?-------1
this指向函数作用域,对也错
function foo(){
var a=2;
this.bar();//this 指向window
}
function bar(){
console.log(this.a);//指向window
}
foo(); //RegereceError: a is not defined
---------------------------------------------------------默认绑定 :独立函数调用。(不带任何装饰即不被引用的函数引用进行调用)↓
function foo(){
console.log(this.a); //this指向window
}
var a=2;
foo();//2
------------------------严格模式下 ↓
function foo(){
'use strict';//严格模式下,全局对象不能进行默认绑定
console.log(this.a);//this指向undefined
}
var a=2;
foo();// typeError:this is undefined
---------------------------------------------------------隐式绑定↓
funcction foo(){
console.log(this.a);//指向foo的调用者 即obj
}
var obj={
a:2,
foo:foo
}
obj.foo();// 2 obg下的foo调用 foo不属于obj 而是指向了obj
---------------------↓对象属性引用链中只有最顶层或者说最后一层会影响调用位置
function foo(){
console.log(this.a);//this指向obj2
}
var obj2={
a:42,
foo:foo
}
var obj1={
a:2,
obj2:obj2
}
obj1.obj2.foo(); //42 理解:最终foo的上下文是obj2的作用域 即直接引用的obj2 this指向obj2
-----------**?**----------↓this 绑定被隐式绑定的函数会丢失绑定对象,也就是说它会应用默认绑定,从而把this绑定到全局对象或者undefined上,这取决于是否是严格模式
function foo(){
console.log(this.a);
}
var obj={
a:2,
foo:foo
};
var bar=obj.foo; //obj.foo this指向obj的此法作用域 bar=obj.foo 把foo函数的引用指向了全局对象bar 即this指向了window
var a='oppsGlobal';
bar();//'oppsGlobal'
同样的函数调用结果----↑↓
function foo(){
console.log(this.a);
}
var obj={
a:2,
foo:foo
};
var a="oopsGlobal";
setTimeout(obj.foo,100);// 'oppsGlobal'
理解:setTimeout内部实现机制类似:
setTimeout(fn,time);
function setTimeout(fn,time){
fn();//this指向window;
}