0

我在类对象中有一个 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

如果我将布尔语句中的“this.name”更改为“name”,它会起作用。知道为什么吗?

4

2 回答 2

5

您立即调用的函数表达式正在创建一个更改上下文的新范围this。当您使用 just 时,name您指的是传递给构造函数的参数。您可以缓存thisbind它来维护上下文:

var self = this;
this.age = (function age() {
  if (self.name...)
}());

// In modern browsers
this.age = (function age() {
  if (this.name...)
}.bind(this)());
于 2013-02-28T23:43:15.753 回答
3

this没有持有它的上下文。实际上,您正在使用该功能创建一个新的。有两种方法可以解决这个问题:

var me = this;
me.name = name;
me.age = (function() {
    return me.name.toLowerCase().charCodeAt(0) <= "n".charCodeAt(0) ? "A" : "B";
})();

或者:

this.name = name;
this.age = (function() {
    return this.name.toLowerCase().charCodeAt(0) <= "n".charCodeAt(0) ? "A" : "B";
}).call(this);

实际上,三个:只需删除this.函数内部,并name使用上面范围内的变量来代替。

于 2013-02-28T23:44:58.243 回答