2015-03-02 47 views
2

我有以下兩個代碼集。第一次警報'真',我知道,它的好。第二個提醒'錯誤',我認爲會提醒'!function(){return false}'。但是,它提醒'錯誤'。第二個代碼塊如何提醒false?有誰能幫我理解嗎?JavaScript:!需要了解它的功能(not())

var myVar = !function(){return false}(); 
alert(myVar); //true 
var myVar = !function(){return false}; 
alert(myVar); //false, I dont understand this, how false can come? 

回答

0

這個問題已經從阿米特條既納一個不錯的答案

我讀了下面他的回答有一個評論提問是說,他需要更多的解釋,這就是爲什麼我張貼這個答案。

第一種情況:

var myVar = !function(){ return false; }(); 

alert(myVar); 

這裏myVar的是一個匿名函數,並通過下面的代碼它調用自身。

var myVar = !function(){ return false; }(); 

就是它,就是執行的匿名功能的自我!

a !function()使用!該功能之前,操作它會導致 被視爲一種表達,所以我們可以把它叫做:

所以,當我們試圖alert(myvar);

那麼它會提醒myVar函數的返回值。已經myVar函數返回一個false,並在我們的代碼將其轉換爲true

!符號那麼它將返回true

認爲我們的代碼是一樣的東西下面

var myVar = function(){ return 10; }(); 

它也將提醒true。因爲在javascript中只有false, NaN, null, undefined, 0 , ""是假的,其他全部是truth

和當上述代碼變爲

var myVar = !function(){ return 10; }(); 

那麼它會提醒false因爲語句return 10在JavaScript是真實的,它會通過!operator

然後,在第二種情況下轉化爲false

var myVar = !function(){return true}; 

alert(myVarz); 

這裏沒有自動執行匿名功能。這裏只有一個匿名函數定義。當我們試圖alert(myVar)

myVar現在是一個函數,這是因爲truthy在JavaScript中只有false, NaN, null, undefined, 0 , ""false等都是truthy。!

在這裏也!進來像!function(){return true};搜易得功能將轉換truefalse藻體。

Reference1


Reference2

+0

它與包含函數的myVar無關。即使沒有()最後,!將第二個示例從函數聲明轉換爲函數表達式,因爲JavaScript認爲它需要找到某個東西的逆。請參閱http://stackoverflow.com/questions/13341698/javascript-plus-sign-in-front-of-function-name – 2015-03-03 12:45:05

+0

@DaveRoss感謝您的有效建議,我已經更新了我的答案 – 2015-03-03 12:58:20

1

第一個片段

var myVar = !function(){ return false; }(); 
// myVar = false; because invocation ----^ 
alert(myVar); // !false = true 

二片段

var myVar = !function(){return false}; 
// myVar = Function myVar = !(Function) and a Function is *truthy* 
alert(myVar); // !true = false 

在第一個片段,你調用它的時候了,所以myVarfalse!false顯然是true

然而,在第二個片段中,您並未調用該函數。相反,myVar現在是一個功能,它是truthy。也就是說,它被認爲是true。所以再次!true = false

請記住,在JavaScript中,falseNaNnullundefined0""falsey和其他一切是truthy

+0

我需要更多這方面的說明一下,你能嗎? – User123 2015-03-02 10:45:12

+0

@ User123你不明白什麼? – 2015-03-02 10:45:34

0

您應該避免使用!函數語句。當你在函數的末尾使用()時,你實際上說你想使用函數的返回輸出。你沒有在最後的陳述中使用它。

var myVar = function(){return true}(); 
 
alert(myVar); //true 
 
var myVar = function(){return false}(); 
 
alert(myVar); //false