为什么结果是全球名称,这是由“这个”引起的?

时间:2015-03-22 15:54:01

标签: javascript node.js

global.name ="global";

var object2 = {
    name:"My Object 2",
    doSomething:function(){
        return function(){
            return this.name;
        };
    }
};

console.log(object2.doSomething()());

为什么结果是"全球"而不是"我的对象2"?

3 个答案:

答案 0 :(得分:3)

.doSomething()函数返回的函数在没有任何上下文的情况下被调用,因此this的值将是全局上下文。

根据您的需要,您可以通过不同方式提供上下文。例如,您可以让doSomething()始终返回绑定到其调用所涉及对象的函数:

doSomething:function(){
    return function(){
        return this.name;
    }.bind(this);
}

您还可以在调用时明确提供上下文:

console.log(object2.doSomething().call(object2));

答案 1 :(得分:0)

这就是为什么,在第一次调用嵌套在console.log()调用之前,传递的参数可以被认为是看起来像这样

console.log(function(){return function(){ return this.name;})

// Note how that the console.log method has not reached yet the (this) reference, it's still like a black box for it

并且在执行第一次调用之后,它看起来像这样:

console.log(function(){ return this.name;})

现在执行时,console.log()方法将解析this值,并且由于它在全局上下文中执行,它将获取存储在全局对象上的变量name中的值。

所以,这里重要的是调用函数的位置,而不是它的定义方式和位置。

注意:您的代码示例不是100%正确,因为您在第一行中以隐式方式定义了一个对象global并在其上设置了一个名为{{1}的属性到name值。

答案 2 :(得分:-1)

该上下文中的

this指的是创建对象的闭包 - 在这种情况下它是全局的。

如果你想让它在自己的闭包中工作,你可以这样做:

global.name ="global";

function MyObject(name) {
    this.name = name;
    return {
        doSomething: function(){
            return this.name;
        }
    }
}

var object2 = new MyObject("My Object 2");

console.log(object2.doSomething());