我有一个像这样的JavaScript对象:
var ali = { firstname: 'ali',
say_hi: function(firstname) {
alert("Greetings " + firstname + ", you are talking to " + this.firstname + "!");
}
};
var some_ref = ali.say_hi;
some_ref("Sabir");
警告:
Greetings Sabir, you are talking to undefined!
但我想要这个:
Greetings Sabir, you are talking to ali!
我认为self.firstname
指的是窗口对象所以它给出了未定义的。
任何人都可以帮助我理解这个问题是什么以及如何解决它?
答案 0 :(得分:1)
要了解归因undefined
而不是ali
的原因,您必须了解 JavaScript绑定。
如果您通过引用而不是直接通过其所有者对象访问方法,那么该方法会丢失其隐式绑定,并且this
会停止引用其所有者对象并返回其默认绑定,表示全局对象(或严格模式下的undefined
)。
最重要的是,重要的是调用函数的方式。
有关详细信息,请参见下文(有例外,但通常可归纳如下):
<强> Breakdown from YDKJS: Determining
this
强>现在,我们可以按照优先顺序总结从函数调用的调用站点确定此问题的规则。按此顺序提出这些问题,并在第一条规则适用时停止。
是否使用new( new binding )调用该函数?如果是这样,这是新构造的对象。
- var bar = new foo()
是使用call或apply调用函数(显式绑定),甚至隐藏在绑定硬绑定中?如果是,则这是显式指定的对象。
- var bar = foo.call(obj2)
是否使用上下文(隐式绑定)调用该函数,也称为拥有或包含对象?如果是这样,那就是上下文对象。
- var bar = obj1.foo()
- 醇>
否则,默认为此(默认绑定)。如果处于严格模式,则选择undefined,否则选择全局对象。
- var bar = foo()
注意:在ES6中,this
是胖箭头函数this
的词汇=>
,并且带有对象简写符号(例如sampleMethod() {}
}),意味着this
将外部上下文作为引用。
答案 1 :(得分:1)
这是什么问题以及如何解决
this
的值取决于函数如何调用。通过将函数分配给变量并将其称为f()
,this
将引用全局对象(或严格模式下的undefined
)。由于没有名称为firstname
的全局变量,this.firstname
将解析为undefined
。
如果您希望this
引用特定对象,您可以.bind
该功能:
var some_ref = ali.say_hi.bind(ali);
要了解有关this
的更多信息,请查看一些互联网参考资料:
答案 2 :(得分:0)
不要只使用ls.get('local Storage').then(function (data) {
console.log(data);
}).catch(function (error) {
console.error(error);
});
this
它会正常工作
ali.firstname
答案 3 :(得分:0)
我建议您使用对象构造函数,以避免在创建新人时重复var ali = ...
代码。我基于Eloquent JavaScript上的以下代码。
function Person(firstname) {
this.firstname = firstname;
}
Person.prototype.say_hi = function(greeter_name) {
alert("Greetings " + greeter_name + ", you are talking to " + this.firstname + "!");
}
var ali = new Person("Ali");
ali.say_hi("Sabir");
&#13;