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

booleanステートメント内の「this.name」を単に「name」に変更すると機能します。なぜですか?

4

2 に答える 2

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)());
于 2013-02-28T23:43:15.753 に答える
3

thisそのコンテキストを保持していません。実際、この関数を使用して新しい関数を作成しています。これを回避する方法は2つあります。

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);

実際には、3つです。this.関数の内部を削除し、name代わりに上記のスコープの変数を使用できるようにします。

于 2013-02-28T23:44:58.243 に答える