global.name ="global";
var object2 = {
name:"My Object 2",
doSomething:function(){
return function(){
return this.name;
};
}
};
console.log(object2.doSomething()());
为什么结果是"全球"而不是"我的对象2"?
答案 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());