我写了一个数组对象然后想通过数组循环。我正在使用下划线_.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');
答案 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');
答案 1 :(得分:0)
您的变量不在范围链中:Scope Chain in Javascript
在第二个例子中,javascript在每个方法中搜索'para1', 但没有定义。之后,将使用父函数(接近func1)启动相同的搜索过程,并且此处有一个名为para1的变量/参数
我认为你可以借助上下文将para1传递给 .each方法: 每个 .each(list,iterator,[context]) 我是一个jQuery人,所以你必须自己查看文档:{{3}}
我希望它可以帮到你
干杯