javascript - 在 lodash 中,为什么谓词和结果变量没有以 var 关键字作为前缀?

标签 javascript arrays global-variables lodash flatten

这是 lodash 中 flattenDeep() 的副本,该函数将传递多维数组并返回已展平的新数组。 flattenDeep() 是递归处理的。

阅读源代码我注意到:

谓词结果后面没有使用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));

最佳答案

它们不是全局的,传递给函数的任何参数都被声明 - 这就是 var 的作用。

所以在这部分函数中:

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

所有传入的参数前面基本上已经有一个var, 并注意 index 确实有一个 var,以免成为全局。

查看这个快速 JSBin 并查看它通知您的错误...

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

关于javascript - 在 lodash 中,为什么谓词和结果变量没有以 var 关键字作为前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37128171/

相关文章:

javascript - 如何在解析中获取关系字段的计数

javascript - 通过 javascript 从浏览器进行局域网唤醒

javascript - Jquery 回调函数无法重定向页面

php - 从类访问其他文件中定义的变量

javascript - 我无法访问我当前的元素

javascript - 如何从复选框中获取值属性

arrays - Matlab - 从矩阵中删除包含0的行和列

java - 如何在 Java 中使用 BufferedImage 更改模拟时钟的钟面

php - 在数据库中添加2组数组

python - 定义全局变量的问题