2016-08-30 48 views
6

我目前正在關注一個JavaScript課程,並且有一些問題了解JavaScript中幕後發生的一些示例(請參閱下面的代碼)。困難時間理解javascript示例

我瞭解大部分代碼,並理解爲什麼輸出記錄是 - > [false,true,true]。但是存在被我逼瘋一個部分(我指着底部在代碼中箭的話):

我的困惑是圍繞參數1

什麼旅途做參數1起飛從checkPastLimitSimplified(1)var arr5 = mapForEach(arr1, checkPastLimitSimplified(1));

我知道當調用checkPastLimitSimplified(1)時,會爲參數1在變量環境中的此函數創建執行上下文。

但現在會發生什麼? checkPastLimitSimplified函數內的函數尚未執行,但剛剛返回。它返回時的樣子是什麼? limiter變量在什麼時候收到參數1

據我所知,.bind(this, limiter);創建該函數的副本。它的limiter在返回之前已經變爲1了嗎?

function mapForEach(arr, fn) { 

    var newArr = []; 
    for (var i = 0; i < arr.length; i++) { 
    newArr.push(
     fn(arr[i]) 
    ) 
    }; 

    return newArr; 
} 

var arr1 = [1, 2, 3]; 

var checkPastLimitSimplified = function(limiter) { // < ----CONFUSED 
    return function(limiter, item) { 
    return item > limiter; 
    }.bind(this, limiter); 
}; 

var arr5 = mapForEach(arr1, checkPastLimitSimplified(1)); 
console.log(arr5); 

回答

4

讓我們重命名變量,看關係:

var checkPastLimitSimplified = function(outer_limiter) { 
    return function(limiter, item) { 
    return item > limiter; 
    }.bind(this, outer_limiter); 
}; 

bind修改函數簽名只是function(item)返回之前。
當客戶端代碼將調用checkPastLimitSimplified(1)(item)時,限制器將從綁定的上下文中替換。

+0

因此,如果我正確理解這一點,那麼通過調用'checkPastLimitSimplified(1)'傳遞給函數的參數'outer_limiter'在函數返回之前是否可用並在.bind中解析? (1,item){ return item>限制器; }'返回?所以'返回'不會停止.bind()在這一點執行? – Yapartase

+0

當然,'return'涉及整個'function(){}。bind()'表達式。 –

0

另一種方式來使其更容易理解在外面把內部功能:

var checkPastLimit = function(limiter, item) { 
    return item > limiter; 
}; 

var checkPastLimitSimplified = function(outer_limiter) { 
    return checkPastLimit.bind(this, outer_limiter); 
}; 

結果將是第一個功能的使用已定義的第一個參數(限)的副本。

這個新函數將只需要第二個參數(item)。

但是這個階段沒有執行功能代碼(與限制的比較)。