var name = 'The Window';
var object = {
name: 'My Object',
getNameFunc: function(){
return function() {
return this.name;
};
}
};
console.log( object.getNameFunc()() );
当我测试代码时。结果是窗口。但我认为this.name;
应为My Object
。我的想法有什么问题。
当我在name : "My Object",
之前添加var时显示错误。?为什么呢?
答案 0 :(得分:3)
this
是它被调用的“接收者”。
即,
x.f()
的 ,函数(this
)内的f
将评估为x
的值。< / p>
对于所有其他情况,this
将在调用的函数内评估为window
。(函数call
,apply
,bind
也可以改变this
......但这是另一个故事。)
在发布的示例中,使用this.name
表单调用了第二个函数(x.f()
) ,因此this
是{{1}对象。
“简单修复”是使用闭包:(第一个函数是以window
形式调用,因此x.f()
与this
相同我们通过使用object
创建的闭包和返回的函数来捕获当前作用域中this
的值。)
self
但是,我可能会考虑另一种设计,具体取决于:)
快乐的编码。
补充说明,征求意见:
...这是因为您使用的格式getNameFunc : function () {
var self = this
return function () {
return self.name
}
}
为circle.getArea()
。因此,getArea函数中的x.f()
计算结果为this
。
在发布的代码中,您连续调用两个不同的函数。想象一下编写这样的代码:
circle
第一个函数调用的形式为var nameFunc = object.getNameFunc()
nameFunc()
,因此getNameFunc中的x.f()
是this
的评估。但是,在第二行中,函数(nameFunc)是以object
形式调用而不是。因此,x.f()
内部的nameFunc(从getNameFunc返回的函数)将评估为this
,如上所述。
答案 1 :(得分:2)
您需要使用.bind()
为方法设置正确的上下文,因此this
关键字将是您想要的实际关键字。
默认情况是this
关键字指向window
对象,因为......这就是JS引擎的工作方式。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
}.bind(this); // <-- sets the context of "this" to "object"
}
};
console.log( object.getNameFunc()() );
答案 2 :(得分:2)
var myObject = {
name:'My Object'
};
console.log(myObject.name);
console.log(myObject['name']);
还有其他各种方法可以在javascript中创建对象。
this
是一个隐藏的参数,它自动从调用函数传递给被调用者。传统的做法是:
function MyObject() {
this.name = 'My Object';
}
myObject = new MyObject();
console.log(myObject.name);
现在你可能只使用闭包:
[**edit**: redacted because not a good method]
现在你可以正确地使用闭包:
function makeObject() {
var THIS = {};
THIS.name = 'My Object';
THIS.sayMyName = function () {
return THIS.name+" is my name";
}
return THIS;
}
有许多图书馆支持&#34;更聪明&#34;制作物品的方法。
答案 3 :(得分:1)
正如其他人所写,您需要定位this
。我相信这段代码可以帮助您了解javascript中this
的工作原理
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
that = this; // targeting this
return function() {
return that.name;
};
}
};
alert(object.getNameFunc()()); // it is My Object now
答案 4 :(得分:1)