簡體   English   中英

新手Javascript:使用添加的括號調用函數時不運行(即使它不需要參數)

[英]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最終undefinedundefined 您在undefined查找childNodes ,並收到錯誤。 window.onload賦值不會發生。

即使你的函數沒有拋出錯誤,它也會返回undefined ,因此window.onload變得undefined ,所以當最終加載頁面時沒有任何反應。

相反,你需要開始認為函數只是另一種價值。 當你說

function a() {
  // ...
}

它與此相同:

a = function() {
  // ...
};

(實際上存在差異,重要的是,但它們現在無關緊要;當你掌握了基礎知識時,請查看它們)。 現在,函數“包含”在變量a 然后你可以這樣做:

var b = a;
b();

它會工作 - 你把(你的函數)中a任何東西放入變量b ,然后通過調用它的新名稱來執行它(因為現在ab引用相同的函數)。 以同樣的方式,之后

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM