2013-02-28 29 views
0

我在類對象中有一個if/else語句。 if檢查一個布爾語句,但返回錯誤的結果。這個charcode布爾語句有什麼問題?

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」布爾語句中只是「名」。任何想法爲什麼?

+1

不太確定,但我認爲這與您的範圍有關。 '(function age(){'創建一個新的作用域,'this'可能不再引用'person'類。Name的作用是因爲名字被傳入類。 – Leeish 2013-02-28 23:42:50

+0

是不是應該使用大字母,我的意思是'Person'而不是'person'? – WooCaSh 2013-02-28 23:44:33

回答

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

+0

+1這個'call'看起來比我的'bind'解決方案好,沒有想到這個。 – elclanrs 2013-02-28 23:46:18

+0

謝謝你,閱讀有關通話,所以現在我明白申請和通話。 – Korey 2013-03-01 00:00:52

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)()); 
+0

即使我真的不知道爲什麼,我也很高興,我說得沒錯,你的澄清是有幫助的 – Leeish 2013-02-28 23:43:45

+0

謝謝,那是我的錯誤 – Korey 2013-03-01 00:01:44

+0

如何使用bind在更進一步的嵌套陳述中? 函數Person(名字,姓氏,工作,家庭,犯罪){ this.crimes =(function criminal(){var policeRecord =「」; (for(var p = 0; p Korey 2013-03-01 00:28:35