首页 > 关于this的问题

关于this的问题

function foo(){
    console.log(this.a)
}
function doFoo(fn){
    var a = "doFoo";
    fn();
}
var obj = {
    a:2,
    foo:foo
};
var a = "global";
doFoo(obj.foo);    //global
    

为什么输出的是global而不是doFoo?


this指向的是window


this有四种用法。
在函数体调用就是默认指向全局window下。
比方这个例子,陷阱重重。
首先obj对象下面有个a属性,
doFoo(obj.foo)看起来是指向obj.a
然而this的指向取决于调用方式,
obj.foo 实际上是foo()的一个引用,
关键采用的是函数调用方法,于是this.a 采取默认方式。

引申一点:
怎么解决此类问题呢?
我们可以采取硬绑定等方式除此以外ES6的新增的方法也能够解决以上问题。

关于javascript更多内容可以参见:
http://www.jianshu.com/users/e343d00ee6f6/latest_articles


fn()在调用的时候,this会指向foo函数this会指向全局,this指向的是动态作用域,根据调用改变指向,而foo函数中没有变量a,所以在全局找


这就是一个局部变量的问题,将问题往深处看,本质的调用如下所示:

function foo(){
    console.log(this.a)
}
function doFoo(){
    var a = "doFoo";
    foo();
}
var a = "global";
doFoo();

输出也是global,因为变量没有进行传递,foo中只识别父级作用域和本作用域内的变量,调用者的变量是不识别的


this的指向是在调用时决定的,首先你声明了一个foo函数,并且将其作为obj的一个方法
,这里如果你调用obj.foo(),会得到2,这是this的一种隐士绑定,但是你采用的是将obj.foo作为参数传入doFoo函数,
这里,参数传递的效果相当于
var fn = obj.foo;这里的效果和直接将foo函数传入的效果是完全一样的。
最后说为什么,不输出doFoo,首先你在函数里定义了一个变量,这个a并不是doFoo的属性,所以不会弹出doFoo,其次fn(),
这中调用方式,与window.fn()完全一样,this是指向window的,这里我把他叫做默认绑定。所以,输出global

【热门文章】
【热门文章】