什麼是你的代碼發生的事情:
您已經綁定了一個對象hello,該函數返回另一個輸出內容的函數。外部函數講充當內部函數的閉包。 由於編譯代碼的方式,JavaScript的行爲有點不同。內部函數不會識別這個變量,而是選擇全局的this.name。
要解決此問題,您將不得不這樣做:
var hello = {
name: "Vishal",
speak: function(to){
//we tell this closure that this is to be taken from function scope and no the global scope
var self = this;
return function(){
console.log(self.name+" says hello "+to);
}();
}
}
hello.speak("Vinay");
瞭解使用情況下綁定
綁定:
創建函數的副本結合被稱爲。然後,您可以傳遞要與此關鍵字關聯的對象或範圍。
例子:
var hello = {
name: "Vishal",
speak: function(to){
return function(){
console.log(this.name+" says hello "+to);
};
}
}
var speakTo = hello.speak("Vinay");
var speakToCall = speakTo.bind(hello); //will give you the desired output.
speakToCall();
現在,這是不綁定的實際使用情況,打電話或應用。這只是向您展示如何使用綁定來實現您的功能。
實際使用情況可以是這樣的:
使用案例:
When you have multiple objects like:
var a = {
firstname: "rahul",
lastname: "arora",
getFullName: function(){
return this.firstname + ' ' + this.lastname;
}
}
//Another object with same properties but without the function
var b = {
firstname: "Micheal",
lastname: "Angelo",
}
//Rather than defining that function again in the object 'b' you can use bind, call or apply to get the desired output.
console.log(a.getFullName.call(b)); // will output Micheal Angelo which is associated to b
我希望它能幫助。
爲什麼你要返回另一個函數的結果,而不是直接在'speak'中調用'console.log'?它會在這種情況下工作。問題在於內部函數是用不同的上下文('this')調用的。 –
@ user3666112使用hello.name而不是 –
我只是想了解使用調用,這是我的要求,而不是console.log你可以考慮另一個返回這裏。 – user3666112