簡體   English   中英

將“額外”參數傳遞給存儲在變量中的函數 - Javascript

[英]Passing “extra” arguments to a function stored in a variable - Javascript

我是Javascript的新手,我是自學的,所以這可能是一個顯而易見的領域,但不管我怎么說這個問題,我似乎無法理解這個問題。 目前我正在閱讀http://eloquentjavascript.net/chapter6.html (這是在mozilla的MDN上)。 我現在已經遇到過這種情況,如果可能的話,我只想簡單地分解一下。

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

我不明白在最后一步isNotNaN(變量)是如何將'額外參數'(NaN)傳遞給存儲在isNotNaN中的函數(否定(isNaN)。“show(isNotNaN(NaN));”

當試圖解釋外殼的概念時,我遇到了同樣的問題。 但我不明白哪里這種說法“南”,在上面的函數是怎么回事 ,因為它似乎對我來說,最后一個語句結束是這樣的:

show(negate(isNaN, NaN));

我很樂意提供更多細節。 將一個額外的參數傳遞給一個已經持有一個帶參數的函數的變量的概念混淆了我的地獄!

沒有“額外”的論點。 negate()函數本身返回一個定義為函數表達式的函數,然后可以使用任意數量的原始(不是額外)參數調用它。 閉包用於返回的函數,以保持對isNaN的引用為func

var isNotNaN = negate(isNaN);

此時, isNotNaN包含對該函數的引用

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

同樣,這里的func引用傳遞給negate函數的isNaN參數,該函數是作用域鏈中的直接父級。 結果類似,但不一樣

var isNotNaN = function (x) {
    return !isNaN(x);
};

它不相同的原因是,如果我們改變isNaN的值,這個函數的行為將會改變。 但是,在您發布的示例中, func的值等於isNaN的原始值,並且由於閉包,不能由其范圍之外的任何內容更改。

本質上,您可以傳入任何函數並獲取一個新函數,該函數返回原始函數的否定結果。 例如:

var isNotArray = negate(Array.isArray);
isNotArray(12);
//-> true

實際上, negate(isNaN)只是將函數返回給變量isNotNaN 此函數接受一個參數(在您的情況下名為x ),然后在取消它並返回結果之前對參數執行函數isNaN

也許這個例子可以為你清楚一些關於閉包的事情:

function foo(x){

    function bar(y){
        return x+y;
    }

    return bar;
}

var fooRef = foo(1); // fooRef references foo() with x set to 1

console.log(fooRef(2), foo(1)(2)); // 3, 3

http://jsfiddle.net/ePwy8/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM