javascript不是范围函数参数

时间:2013-10-26 14:31:19

标签: javascript underscore.js

我写了一个数组对象然后想通过数组循环。我正在使用下划线_.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');

2 个答案:

答案 0 :(得分: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');

Fiddle

答案 1 :(得分:0)

您的变量不在范围链中:Scope Chain in Javascript

在第二个例子中,javascript在每个方法中搜索'para1', 但没有定义。之后,将使用父函数(接近func1)启动相同的搜索过程,并且此处有一个名为para1的变量/参数

我认为你可以借助上下文将para1传递给 .each方法: 每个 .each(list,iterator,[context]) 我是一个jQuery人,所以你必须自己查看文档:{​​{3}}

我希望它可以帮到你

干杯