2013-10-26 74 views
0

我寫了一個數組對象,然後通過數組wonna循環。我正在使用下劃線_.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變量?我在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'); 

回答

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到與上下文的幫助。每個方法的變量/參數: 每個。每個(列表,迭代器,[背景]) 我是一個jQuery的傢伙,所以你必須檢查你自己的文檔:http://underscorejs.org/#each

我希望它能幫助你

乾杯