2014-09-18 24 views
1

在編寫API時,我傾向於將函數按照自頂向下的順序排列,最暴露的函數位於頂部,輔助函數位於底部。但是,在定義函數var而不是定義魔術function時,函數在定義之前無法使用。那麼如果我們有一個名爲$company的對象而且我們正在定義它的方法,那又如何?我能否以這種方式安全地訂購我的JS?在定義第一個函數之前在另一個函數中使用函數

var $company = {}; 

$company.foo = function(x) { 
    $company.bar(x*x); // used in definition, but not called directly - ok? 
}; 

// $company.bar(6) // this would produce an error 

$company.bar = function(x) { 
    alert(x); 
}; 

它似乎在我當前版本的Firefox中工作,但我想知道它是否定義了行爲。有沒有任何版本的IE瀏覽器打破?

+1

當你調用它時,JS將使用你的函數,所以當你聲明foo時,bar可能不存在,但是當foo被調用時它應該存在。 – Loenix 2014-09-18 15:55:52

回答

2

是的,你可以。

功能只有定義,不執行。

的JS引擎執行文件中的每一行:

var $company = {}; 
$company.foo = ...; 
$company.bar = ...; 

,後來,在$company.foo執行,$company.bar定義!

+0

這是有道理的。儘管如此,我找不到它明確寫入的內容。我確實找到了[這個其他的答案](http://stackoverflow.com/a/3887590/2407870),它談論它。 – 2014-09-18 16:15:24

+1

作爲被引用的答案和長時間的javascript黑客的作者,我可以告訴你一些關於javascript/ECMAscript規範是如何編寫的。首先是Netscape的實現(只有代碼,沒有規格),然後微軟儘可能地複製它(包括錯誤),然後人們認爲應該有一個標準(主要是由於擔心微軟將他們的js引擎發展到100%與其他人不兼容)。這個過程直到今天,蘋果公司發明的功能變成了一種叫做「HTML5」的標準功能,微軟發明的語法成爲了SVG的一部分。 – slebetman 2014-09-18 16:23:39

+1

也許是由於這個原因,JavaScript規範實際上是一種儘可能接近當前文檔的嘗試javascript的實現(除了標準委員會無法達成一致的部分)。因此,很多瀏覽器碰巧具有完全兼容的行爲的部分被忽略,並且仍然沒有記錄。在過去,我們必須編寫測試腳本來了解js是如何工作的(特別是對於IE,因爲我們無法訪問源代碼) – slebetman 2014-09-18 16:26:17

0

是的,這是有效的,因爲沒有瀏覽器(或沒有JavaScript引擎)對.的權利做出假設,直到它必須評估左邊的表達式爲止。

但很多人不喜歡這種「向前看」,並利用回調函數來代替:

$company.foo = function(x, callback) { 
     callback(x*x); 
} 

此代碼是更明顯,更靈活,因爲它可以調用幾乎所有的東西,你可以curry它等等。

+0

謝謝。我不確定這取決於'。'儘管如此,由於以下也不會產生錯誤:'var a = function(){b(); }; var b = function(){alert(1); };' – 2014-09-18 16:12:05

+1

好吧,這裏有兩個效果:JavaScript將解析函數體(以檢查語法錯誤),但它不會對各個位的含義做出許多假設。因此,從某種意義上說,與函數體和'.'有相同的情況:只要語法正常,JavaScript不會在意(還)是否正確/正確。 – 2014-09-19 08:48:43

相關問題