2012-05-23 47 views
2
!function() { return false; }() 

我知道你爲什麼要寫這樣的東西,但我有一個關於它的工作方式的問題。據我瞭解,感嘆號做了兩兩件事:!function(){return false; }()

  1. 它作用於function() { return false; },其變更爲表達
  2. 它還作用於執行功能的結果,從而使整條生產線的計算結果爲true

所以我的問題是:

  1. 這是正確的解釋?
  2. 如果它是正確的,那麼因爲()綁定比!更緊密,第一部分(函數本身變成表達式)是如何發生的?爲什麼感嘆號不是貫穿始終?
+0

它會出現這樣:http://jsfiddle.net/ –

+1

可能是有用的:https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence – jbabey

回答

1

1)它不「變」了。當解析器遍歷「函數」位時,它會執行期望的表達式,所以「函數」被解析爲(可能是匿名的)函數表達式的一部分,而不是作爲函數語句。

2)它作用於全行。如果你看一下優先級,由jbabey建議,您會看到函數調用結合更加緊密,則否定運算符等全像被評估爲

! ((function(){})()); 

或類似,或許更可讀的版本:

var f = function(){ ... }; 
! (f()); 
+0

你答案的第一部分對我來說更加清晰。謝謝! –

4

根據operator precedence,所述function聲明(其是用於new Function簡寫)將第一發生,函數調用()將第二發生,並且否定!會發生最後。

編輯爲清楚:你可以重寫一個行這完成同樣的事情:

// declare an anonymous function and assign it to the myFunc variable 
var myFunc = function() { 
    return false; 
}; 

// execute the function and store it's return value (false) in returnValue 
var returnValue = myFunc(); 

// negate the return value (true) 
var output = !returnValue; 
+0

謝謝,但我也明白這部分並在我的問題中提到()比!更緊密地綁定。我對另一個副作用是如何產生困惑的。 –

相關問題