我在类对象中有一个if / else语句。 if检查一个布尔语句,但返回错误的结果。
function person(name) {
this.name = name;
this.age = (function age() {
if (this.name.toLowerCase().charCodeAt(0) <= "n".charCodeAt(0)) {
return "A";
}
else {
return "B";
}
})();
}
var zoey = new person("Zoey");
console.log(zoey.name);
console.log(zoey.age); // returns A
console.log("Zoey".toLowerCase().charCodeAt(0)); // returns 122
console.log("n".charCodeAt(0)); // returns 110
如果我将boolean语句中的“this.name”更改为“name”,它就可以工作。知道为什么吗?
答案 0 :(得分:5)
您立即调用的函数表达式正在创建this
的上下文发生更改的新范围。当你只使用name
时,你指的是传递给构造函数的参数。您可以缓存this
或bind
来维护上下文:
var self = this;
this.age = (function age() {
if (self.name...)
}());
// In modern browsers
this.age = (function age() {
if (this.name...)
}.bind(this)());
答案 1 :(得分:3)
this
没有保留其背景。实际上,您正在使用该函数创建一个新的。有两种方法:
var me = this;
me.name = name;
me.age = (function() {
return me.name.toLowerCase().charCodeAt(0) <= "n".charCodeAt(0) ? "A" : "B";
})();
OR:
this.name = name;
this.age = (function() {
return this.name.toLowerCase().charCodeAt(0) <= "n".charCodeAt(0) ? "A" : "B";
}).call(this);
实际上,有三个:只需删除函数中的this.
,然后使用上面作用域中的name
变量。