2013-10-26 2 views
0

Я написал объект массива, а затем цикл winna через массив. Я использую функцию подчеркивания _.each для выполнения этой работы. Вдруг это происходит неожиданное дело в моем коде, рассмотрим следующий кодjavascript не имеет функции функции области

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 переменную? Я выполняю функцию _.each в func и, на мой взгляд, должен нести сферу действия.
Но если я пишу такой код, то область цепь работает отлично

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'); 

ответ

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.

0

Ваши переменный не в цепочке областей видимости: Scope Chain in Javascript

Во втором примере Javascript ищет «para1» в каждый метод, , но определения нет. После того, как то же процедура поиска будет началась с родительской функцией (близкий к func1) и при этом есть переменный/аргумент называется para1

Я думаю, что вы можете передать para1 в .each метод с помощью контекста: каждый .each (список, итераторы, [контекст]) Я парень JQuery, так что вы должны проверить документацию по своему усмотрению: http://underscorejs.org/#each

Я надеюсь, что это помогает вам

Приветствия

Смежные вопросы