首页 > 关于JavaScript里this指向的问题?

关于JavaScript里this指向的问题?

在看《JavaScript高级程序设计(第三版)》时遇到了一个关于this指针的问题,希望大神能帮小弟解释清楚,在此谢过。

有如下代码段:
var name="The Window";

var object={

name:"MyObject",
getName:function(){
    return this.name;
}

};

object.getName(); //"My Object"
(object.getName)(); //"My Object"
(object.getName=object.getName)(); //"The Window",非严格模式下

1.第一种情况是没有问题;
2.第二种情况加上了括号,表示引用了一个函数,书上说此时的object.getName和(object.getName)的定义相同,所以this的值得到了维持,所以返回"My Object";
3.第三种情况中,书上说赋值表达式的值是函数本身,所以this的值不能得到维持,结果就返回了"The Window"。

现在的问题是,尽管书上解释了,我还是搞不懂为什么第二种情况下this值得到了维持,而第三种情况下this值又得不到维持了呢?


最后一个是表达式,函数的this指向null,null在非严格模式下被转为全局对象,上面俩个因为是对象方法所以this值指向该对象


看我之前的提问,http://.com/q/1010000003504317


1.函数名,方法名和变量名都是标识符,函数和方法都是对象。而标识符就是指向对象的。“=”在你这个环境中就是赋值表达式,引用类型值在传递中也是按值传递的。你把object.getName用()括起来他就是一个引用了,它的指针指向getName()方法(对象)。

2.匿名函数立即执行表达式是 (function (x){})(y),函数也是对象,左边括号的意义就是立即调用这个对象,而不是通过函数名指向函数对象这个方式。

3.函数和方法不都是对象吗,既然是对象就有一个方法。而函数和方法的对象就是 call()。这里有一个简单转换式,比如当调用对象方法的时候object.getName()这个可以换成object.getName.call(object),所以this指向的对象是object。

当你把object.getName=object.getName用()括起来的时候,object.getName标识符的指针就被赋值给了object.getName这个标识符,(函数对象没有值,引用类型值是按值(指针)传递的,你的书可能错了)这里有很重要的一点就是,左边的object.getName和右边的object.getName是不相同的。由于你先前没有声明左边的object.getName所以它是匿名的。你可以把左边的object.getName换成m或者n可以得到同样的结果:

var name="huangtao";

var obj={
    name:"hahhaha",
    foo:function (){
        console.log(this.name)
    }
}
obj.foo();
(obj.foo)();
(m=obj.foo)();//(m=obj.foo).call(window)

既然它是匿名的我们调用3.中的公式将(m=obj.foo)()换成(m=obj.foo).call(window);ok you see 这时this所指向的对象就是window了。

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