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;
  }

 

posted @ 2017-09-15 16:54  _increase  阅读(169)  评论(0编辑  收藏  举报