这个charcode布尔语句有什么问题?

时间:2013-02-28 23:40:18

标签: javascript

我在类对象中有一个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”,它就可以工作。知道为什么吗?

2 个答案:

答案 0 :(得分:5)

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

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变量。