<script type="text/javascript">
function BigComputer(answer) {
this.the_answer = answer;
this.ask_question = function() {
alert(this.the_answer);
}
}
function addhandler() {
var deep_thought = new BigComputer(42),
the_button = document.getElementById('thebutton');
the_button.onclick = deep_thought.ask_question;
}
window.onload = addhandler;
</script>
爲什麼此腳本返回undefined而不是42? 這是我的理解:
1)在網頁加載時,我們運行'addhandler'方法。
2)在這個方法中,我們爲deep_thought變量創建BipComputer的實例。此外,我們建立了42處答案(BipComputer類中的公共變量)
3)然後,我們設置了按鈕參考(HTML文件中)
4)點擊按鈕活性和來這裏的魔法:
在我意見是要打印出42號,因爲我們在第2步爲此做了設置,但是nah變量是「Undefined」?
Javascript - Scopes
另一個問題,運行沒有()(沒有參數傳遞時)和()方法之間的區別是什麼。 [像addhandler方法]。
也許這個問題很簡單,但我曾經用java和php編程,現在在面向JavaScript的編程思維方式對我來說很奇怪。函數看起來像類,類看起來像函數,沒有真正的構造函數和東西。
但沒關係,讓我們回到問題:)
我真的很感激任何幫助。
@Edit
感謝@lbstr我發現有用的鏈接,大家誰在問同樣的問題,像我一樣。 http://web.archive.org/web/20080209105120/http://blog.morrisjohns.com/javascript_closures_for_dummies
addhandler在該示例中沒有被顯式調用。它被傳遞爲瀏覽器在適當的時候調用的'window.onload'的引用。只有當你把它作爲構造函數調用時,你纔可以不用'()'來執行一個函數。 – zzzzBov
@ zzzzBov-該函數被添加爲一個按鈕的點擊監聽器,所以它被按鈕的點擊處理程序調用。 – RobG
@RobG,讓我改述一下,只有當你把它作爲一個構造函數(即'new Foo')調用時,你纔可以明確地執行一個不帶'()'的函數。任何其他情況都需要調用瀏覽器函數或行爲來爲您調用函數。 – zzzzBov