在高级javascript中看到的,不明白

var name = "window";
var object = {
    name: "My object",
    getName: function(){
         return this.name;
    }
};

//这里不明白,为什么会返回window,书上说this的值不能得到维持,为什么啊
(object.getName = object.getName)(); //"window"在非严格模式下;
阅读 2.8k
3 个回答

object.getName = object.getName 是一个等号运算符,返回的时候getName本身

你可以尝试用

var a={x:11},b={y:12};
console.log(a=b)结果是{y:12};

这里的object.getName就是

function(){
     return this.name;
}

当返回这个匿名函数的时候 ,他是在window域下的 而不是在 object域下

所以结果就是 window//window.name='window'

可以参考 http://segmentfault.com/a/1190000003860689

object.getName = object.getName 返回的是一个 Function 对象,
然后在全局环境下执行这个函数(没有指定对象),就会以全局对象 window 作为其 this

相当于

var f = object.getName;
f();   // 注意不是 object.f()

如果这样写可能会更清晰一点

var name = "window";
var f = function(){
     return this.name;
};

var object = {
    name: "My object",
    getName: f
};

var f2 = object.getName;   // f2 === f
f2();   // 与 f(); 等同
(object.getName = object.getName)();//"window"

其实就是个赋值表达式将作为object的getName属性的函数返回了,再以普通函数的形式调用,此时函数内的this即全局对象,所以输出 window

推荐问题
宣传栏