2016-05-10 6 views
1

Вот копия flattenDeep() в lodash, функция, которая передаст многомерный массив и вернет новый массив, который был сплющен. Этот flattenDeep() обрабатывается рекурсивно.В lodash почему переменные предиката и результатов не имеют префикса с ключевым словом var?

Чтение исходного кода, я заметил, что:

predicate и results не использовать вар за ними?

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

Вопрос: Почему lodash использовать глобальные переменные для предиката и результатов? Есть ли причина/теория?

Full src

Облегчённые ЯШ:

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