2015-09-25 84 views
5

我在HTML文件中的以下代碼:爲什麼要調用這個函數?的JavaScript /窗口

<script type="text/javascript"> 
     window.never = function() { 
       console.log('this function is never called'); 
     } 
     (function(d, s, id){ 
      var js, srjs = d.getElementsByTagName(s)[0]; 
      if (d.getElementById(id)) {return;} 
      js = d.createElement(s); js.id = id; 
      js.src = "this.script.does.not.exist.js"; 
      srjs.parentNode.insertBefore(js, srjs); 
     }(document, 'script', 'streamrail-jssdk')); 
    </script> 

見琴:http://jsfiddle.net/sebvaeja/

查看控制檯,你可以看到,window.never功能實際上是所謂的('這個功能是從來沒有所謂'寫入控制檯)。當使用Chrome開發工具調試時,我在調用堆棧中看到調用者是關閉的(第一行:http://jsfiddle.net/sebvaeja/)。

如果我改變從來功能要關閉全球範圍內:

function never() { 
      console.log('this function is never called'); 
    } 

那麼它是不被調用。

有人可以請解釋爲什麼window.never函數被調用?什麼觸發了呼叫?我想這與窗口對象上的函數有關,但我無法看到背後的推理。

+0

簡而言之,你有一個語法錯誤。 :) – isherwood

+0

這也是一個重複,但我找不到它。 –

+1

'var log = function(){console。日誌('這個函數被稱爲'); }(42)' –

回答

13

的函數表達式後面括號:

window.never = function() { ... } 
(...) 

函數表達式後的換行不結束變量聲明,所以這是一個函數調用解析器:

function() { ... }(...) 

實際上,您在這裏使用的是相同的技術:

(function(d, s, id){ 
    // ... 
}(document, 'script', 'streamrail-jssdk')) 

這是一個函數表達式,後跟(...),它調用函數。

解決方案:在定義之後加上一個分號,你就很好。


如果我改變從來功能要關閉全球範圍內......然後,它不會被調用。

在這種情況下,函數定義被解釋爲函數聲明,而不是表達式。功能聲明更像是聲明,因此不能成爲CallExpression的一部分。因此下面的括號被解釋爲分組操作符(就像您所期望的那樣)。

5

將函數聲明後的分號:

window.never = function() { 
      console.log('this function is never called'); 
    }; 

這是因爲(...)直接事後觸發函數調用。

window.never = function() { 
      console.log('this function is never called'); 
    } 
    (...) // <-- Triggers call of `window.never` 
相關問題