2014-03-01 41 views
1

test.testHello(helloWorld.sayHello);運行時,它不能識別我插入了新的問候語,因爲問候語是未定義的。我可以使用bind來確保它在適當的範圍內運行,但我不確定爲什麼它不在適當的範圍內運行。有人可以解釋爲什麼會發生這種情況並向我展示更好的解爲什麼我的回調失去了它的範圍?

解決方案:test.testHello(helloWorld.sayHello.bind(helloWorld));

http://jsfiddle.net/EzabX/

var HelloWorldClass = function() { 


this.greetings = []; 
} 
HelloWorldClass.prototype.addGreeting = function(greeting) { 
    this.greetings.push(greeting); 
} 
HelloWorldClass.prototype.sayHello = function() { 
    document.getElementById('output').innerHTML += this.greetings; 
    this.greetings.forEach(function(greeting) { 
     greeting.execute();   
    }) 
} 

var TestClass = function() { 
    this.testHello = function(callback) { 
     alert("TestHello is working, now callback"); 
     callback(); 
    } 
} 


var main = function() { 
    var helloWorld = new HelloWorldClass(); 
    var test = new TestClass(); 
    helloWorld.addGreeting({ 
     execute: function() { 
      alert("Konichiwa!"); 
     } 
    }); 
    helloWorld.sayHello(); 

    test.testHello(helloWorld.sayHello); 
} 

main(); 
+2

你說什麼範圍? – Vinz243

+0

另一種考慮它的方式是'this'不是對建築環境/範圍的參考。它是對函數的* invoker *的引用。誰或調用'callback'?不是'helloWorld'。 'bind'給你一個調用者穩定的函數 –

回答

0

管理原型函數範圍內this變量調用時作爲回調可以是複雜的新用戶使用。你並不總是需要一個類的所有功能的原型。如果你真的想用一個原型函數來看看Javascript .bind(this)的實現。谷歌和Stackoverflow是你在這個話題上的朋友。例如:Preserving a reference to "this" in JavaScript prototype functions

問題的代碼與this指DOM窗口對象,而不是一個HelloWorld實例:

this.greetings.forEach(function(greeting) { 
     greeting.execute();   
    }) 

非原型版本的作品好了,簡單易用。小提琴:http://jsfiddle.net/EzabX/2/

var HelloWorldClass = function() { 
    var greetings = []; 

    this.greetings = greetings; 

    this.addGreeting = function(greeting) { 
     greetings.push(greeting); 
    }; 

    this.sayHello = function() { 
     document.getElementById('output').innerHTML += greetings; 
     greetings.forEach(function(greeting) { 
     greeting.execute();   
     }) 
    }; } 
+0

'問候'沒有什麼錯。你認爲在那個片段中究竟是什麼感覺? – Bergi

+0

'this'指的是Window而不是HelloWorld。不確定工作答案和其他工作答案的正確鏈接是如何投票的。調整了違規行。 –

+0

在'helloWorld.addGreeting(...)'調用中,'this * * does *指向'helloWorld'。我沒有因爲鏈接而失望,但是由於錯誤的術語(「範圍」),錯誤的解釋以及幾乎沒有幫助的代碼建議。 – Bergi

相關問題