2016-05-10 7 views
1

ここには、多次元配列を渡してフラット化された新しい配列を返す関数lodashのflattenDeep()のコピーがあります。このflattenDeep()は再帰的に処理されます。なぜlodashでは、predicateとresultsの変数の先頭にvarキーワードがないのですか?

predicateresultsは、その背後にVARを使用しないでください:

私がいることに気づいたソースコードを読みますか?

 predicate || (predicate = isFlattenable); 
     result || (result = []); 

質問:なぜlodash述語と結果のためのグローバル変数を使用しましたか?これの背後に理由/理論がありますか?

Full src

取り除かJS:

var bigarray = [[1],[2,[3,3]],[1], 1]; 


/** 
* Checks if `value` is a flattenable `arguments` object or array. 
* 
* @private 
* @param {*} value The value to check. 
* @returns {boolean} Returns `true` if `value` is flattenable, else `false`. 
*/ 
function isFlattenable(value) { 
    return Array.isArray(value); 
} 

/** 
* The base implementation of `_.flatten` with support for restricting flattening. 
* 
* @private 
* @param {Array} array The array to flatten. 
* @param {number} depth The maximum recursion depth. 
* @param {boolean} [predicate=isFlattenable] The function invoked per iteration. 
* @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. 
* @param {Array} [result=[]] The initial result value. 
* @returns {Array} Returns the new flattened array. 
*/ 
function baseFlatten(array, depth, predicate, isStrict, result) { 
    var index = -1, 
     length = array.length; 

    predicate || (predicate = isFlattenable); 
    result || (result = []); 

    while (++index < length) { 
    var value = array[index]; 
    if (depth > 0 && predicate(value)) { 
     if (depth > 1) { 
     // Recursively flatten arrays (susceptible to call stack limits). 
     baseFlatten(value, depth - 1, predicate, isStrict, result); 
     } else { 
     arrayPush(result, value); 
     } 
    } else if (!isStrict) { 
     result[result.length] = value; 
    } 
    } 
    return result; 
} 


/** 
* Recursively flattens `array`. 
* 
* @static 
* @memberOf _ 
* @since 3.0.0 
* @category Array 
* @param {Array} array The array to flatten. 
* @returns {Array} Returns the new flattened array. 
* @example 
* 
* _.flattenDeep([1, [2, [3, [4]], 5]]); 
* // => [1, 2, 3, 4, 5] 
*/ 
function flattenDeep(array) { 
    var length = array ? array.length : 0; 
    return length ? baseFlatten(array, Infinity) : []; 
} 

console.log(flattenDeep(bigarray)); 

答えて

1

彼らはグローバルではありませんが、関数に渡されるパラメータが宣言されている - varが何をするかです。機能のこの部分でそう

function baseFlatten(array, depth, predicate, isStrict, result) { 
    var index = -1, 

、本質的に、すでに、彼らの前にvarを持っ となっていないようindexは確かに、varを持っていないことに注意してくださいパラメータに渡されたすべてのグローバル。

はこのクイックJSBinをチェックアウトし、それが> _ <

https://jsbin.com/kebekib/3/edit?js,console

+0

メイクセンス...を通知するエラーを参照してください。これは愚かな疑問でした。 –

+0

ダムではありません...それを汗ばませないでください! – JordanHendrix

関連する問題