[英]Newbie Javascript: Function doesn't run when calling it with added parenthesis (even though it doesn't need parameters)
這是我的功能,提醒我body
標簽的childNodes
數量。
function countBodyChildren() {
var body_element = document.getElementsByTagName("body")[0];
alert(body_element.childNodes.length);
}
window.onload = countBodyChildren;
該函數運行正常,但是當我將add ()
添加到函數名的末尾時,即window.onload = countBodyChildren();
該功能無法運行。 為什么是這樣? 我想調用函數,即使它們不需要任何參數,你總是將()
添加到它的名字的末尾。
我想調用函數,即使它們不需要任何參數,你總是將()添加到它的名字的末尾。
你沒想到。 但是在這里,你不想調用這個函數; 你想告訴瀏覽器什么時候來電話。
添加括號時,將立即調用該函數(不加載)。 該函數執行; 試圖查找body
元素,但尚未加載; 所以你body_element
最終undefined
為undefined
。 您在undefined
查找childNodes
,並收到錯誤。 window.onload
賦值不會發生。
即使你的函數沒有拋出錯誤,它也會返回undefined
,因此window.onload
變得undefined
,所以當最終加載頁面時沒有任何反應。
相反,你需要開始認為函數只是另一種價值。 當你說
function a() {
// ...
}
它與此相同:
a = function() {
// ...
};
(實際上存在差異,重要的是,但它們現在無關緊要;當你掌握了基礎知識時,請查看它們)。 現在,函數“包含”在變量a
。 然后你可以這樣做:
var b = a;
b();
它會工作 - 你把(你的函數)中a
任何東西放入變量b
,然后通過調用它的新名稱來執行它(因為現在a
和b
引用相同的函數)。 以同樣的方式,之后
window.onload = countBodyChildren;
window
對象的onload
屬性現在包含您的函數。 然后,瀏覽器將執行加載完成后的任何操作。
你有一個過早執行的情況。
window.onload
期望的是對函數或函數定義的引用。
放置括號時,實際執行該函數,它是分配給window.onload
的函數的返回值。
window.onload = countBodyChildren();
這就是說“調用函數,並將函數的返回值賦給window對象的onload屬性。你的函數什么都不返回。
例如
function countBodyChildren() {
var body_element = document.getElementsByTagName("body")[0];
alert(body_element.childNodes.length);
return 5;
}
window.onload = countBodyChildren();
這將為onload道具分配5。 不是你想要的。 你需要為onload prop分配一個函數引用,所以js引擎可以在事件發生時調用該函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.