0

我写了一个数组对象,然后在数组中循环。我正在使用下划线 _.each 函数来完成这项工作。突然在我的代码中发生了意想不到的事情,请考虑以下代码

var _ = require('underscore');

var myArray = [ 'RE', 'FR', 'TZ', 'SD'];

var traverse = function (element, index, list) {

    console.log(para1);
    console.log(element);

}

var func1 = function (para1) {
    _.each(myArray, traverse);
}

func1('test');

作为输出,我收到了错误消息

Volumes/Develop/node_sample/scope.js:7
    console.log(para1);
                ^
ReferenceError: para1 is not defined
    at traverse (/Volumes/Develop/node_sample/scope.js:7:14)
    at Array.forEach (native)
    at Function._.each._.forEach (/Volumes/Develop/node_sample/node_modules/underscore/underscore.js:79:11)
    at func1 (/Volumes/Develop/node_sample/scope.js:13:4)
    at Object.<anonymous> (/Volumes/Develop/node_sample/scope.js:16:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

为什么遍历函数不能识别 para1 变量?我在 func 中执行 _.each 函数,我认为应该携带范围。
但是如果我这样写代码,那么作用域链就可以正常工作

var _ = require('underscore');

var myArray = [ 'RE', 'FR', 'TZ', 'SD'];

var func1 = function (para1) {
    _.each(myArray, function (element, index, list) {

        console.log(para1);
        console.log(element);

    });
}

func1('test');
4

2 回答 2

1

你已经回答了你自己的问题。para1只存在于func1. 您不会以traverse任何方式将其传递给它。

你的第二个例子很好,或者你可以这样做:

var myArray = [ 'RE', 'FR', 'TZ', 'SD'];

var traverse = function (para1, myArray) {
  _.each(myArray, function (element, index, list) {
    console.log(para1);
    console.log(element);
  });
}

var func1 = function (para1) {
  traverse(para1, myArray);
}

func1('test');

小提琴

于 2013-10-26T15:19:25.427 回答
0

您的变量不在作用域链中:Javascript中的作用域链

在第二个示例中,javascript 在 each 方法中搜索“para1”,但没有定义。之后,相同的搜索过程将从父函数(靠近 func1)开始,此时有一个名为 para1 的变量/参数

我认为你可以在上下文的帮助下将 para1 传递给 .each 方法:每个.each(list, iterator, [context]) 我是一个 jQuery 人,所以你必须自己检查文档:http://underscorejs .org/#each

希望对你有帮助

干杯

于 2013-10-26T15:09:59.760 回答