2011-02-25 74 views
1

能有人請解釋這個方案採取的步驟,並在他們採取以產生結果「假」什麼是這個JavaScript程序需要

function negate(func) { 
    return function(x) { 
    return !func(x); 
    }; 
} 
var isNotNaN = negate(isNaN); 
show(isNotNaN(NaN)); 
+3

功課可能的預期效果? – jondavidjohn 2011-02-25 01:27:49

+2

不,我真的是一個試圖自學Javascript的老傢伙......我希望這是作業,因爲我會有一位老師! – mjmitche 2011-02-25 01:31:59

回答

8
// 1. A function called "negate is declared 
function negate(func) { // 3. The "isNaN" function is received by negate(). 

    return function(x) { // 4. A function is returned from the negate() call 
    return !func(x);  //  that invokes the "isNaN" function, and returns 
    };      //  the logical opposite of its return value. 

} 

        // 2. The built in "isNaN" function is passed to negate() 
var isNotNaN = negate(isNaN); 
// 5. The function returned from negate() is assigned to the "isNotNaN" variable 

     // 6. The "isNotNaN" function is invoked, and passed the "NaN" value. 
show(isNotNaN(NaN)); 
// 7. The result returned from "isNotNaN" is passed to the show() function. 

最終的結果是,你有一個返回isNaN功能相反的功能。

似乎過於矯枉過正,你可以自己撥打isNaN!

show(!isNaN(NaN)); // gives the same result 
+1

+1我喜歡帕特里克! – alex 2011-02-25 01:32:04

+1

很好完成:-) – Pointy 2011-02-25 01:34:08

+0

@alex:@Pointy:謝謝。 :o) – user113716 2011-02-25 01:37:11

1

,當你調用該函數求反的順序步驟它會在您傳遞給它的函數週圍創建一個閉包。所以當你調用isNotNaN時,它實際上正在運行isNaN,它被封裝在函數中,然後用boolean not運算符「!」否定它。

2
  1. 定義negate()函數。
  2. 設置變量isNotNaN返回的negate(isNaN)
  3. negate()返回一個函數,同時保持範圍func(在這種情況下isNaN)。
  4. 呼叫show()isNotNan(NaN)(通過非數字到否定的isNaN)。與(! isNaN(NaN))相同。
2

該代碼定義了一個函數「否定」的是作爲一個參數另一個功能。 「否定」函數本身返回另一個函數,它返回傳入參數的參數函數調用結果的對立布爾值。

然後代碼定義一個變量「isNotNan」,並將其設置爲等於到一個叫做「isNaN」的函數(我們在這裏沒有看到)調用「negate」的結果。撥打功能與常數NaN實際上是相同的呼叫!isNaN(NaN),這是false,因爲NaNNaN

1
function negate(func) { 
    return function(x) { 
    return !func(x); 
    }; 
} 
var isNotNaN = negate(isNaN); 
show(isNotNaN(NaN)); 

允許從頂部開始:

function negate(func) 
{ 
    ... 
} 

聲明一個函數negate用參數func。該函數返回一個匿名函數:

function(x) 
{ 
    return !func(x); 
} 

匿名函數將執行原有功能的func參數提供的功能,但否定了迴歸vaule。

然後isNotNaN被設定爲,將返回true當參數是NaN,並false當參數NaN的功能;

var isNotNaN = negate(isNaN); 

最後NaN被卡入函數返回false

show(isNotNaN(NaN));