2014-04-23 44 views
1

我對JavaScript相當陌生,甚至對流星來說更新,對於我所瞭解的關於可變範圍和現實的瞭解有點困惑。所以我有這個流星事件幫手:流星可變範圍

Template.test.events({ 
    'click .selector': function (e) { 
    e.preventDefault(); 
    var someArray = [1,2,3,4]; 
    var someVariable = "jquery slector data"; 

    console.log(someVariable); //this works as expected 

    someArray.each(function(index, el) { 
    console.log(someVariable); //not defined? 
    }) 
    } 
}) 

我的印象是,任何變量對外宣稱我。每個功能將可在它的內部?但是我沒有定義。這是一個流星特定的東西或一般的JavaScript?另外,如何讓變量在.each函數中可訪問,而不使它們成爲全局變量?我不認爲在.each循環中定義我的變量將是理想的,因爲這意味着多次訪問DOM。

謝謝。

回答

3

問題似乎是您正在嘗試使用each()方法,該方法在Array.prototype上不存在。我相信你正在尋找Array.prototype.forEach()。下劃線的_.each(array, callback)方法也可以工作,並且與舊版瀏覽器更兼容。

這應該工作:

Template.test.events({ 
    'click .selector': function (e) { 
    e.preventDefault(); 
    var someArray = [1,2,3,4]; 
    var someVariable = "jquery slector data"; 

    console.log(someVariable); 

    someArray.forEach(function(val, index) { 
     console.log(someVariable); 
    }); 
    } 
}); 

或者,兼容性:

_.each(someArray, function(val, index) { 
    console.log(someVariable); 
    }) 

我相信你的困惑使用jQuery的$.each()方法,它從本地forEach不同的方式工作,並強調的​​莖。首先,jQuery具有不同的參數順序(注意,我在代碼中切換了參數的順序)。一般來說,我建議使用Underscore來處理與收藏相關的功能,並且主要將jQuery用於DOM操作。

+0

感謝您的回覆。我將你的例子複製到我的Chrome控制檯中,它可以工作。 'console.log(someVariable)'返回「jquery選擇器數據」。 但是,當我在我的Meteor事件處理程序中放入完全相同的代碼時,我在forEach循環中得到了「未定義」。 – user2209090

+0

嗯,它對我來說工作得很好。顯示我用來測試它的代碼[這是一個要點](https://gist.github.com/sbking/11239824)。你能發佈你的完整的代碼嗎? – sbking

+0

其實它工作! (在這裏仍然在學習)...我在做的是在forEach循環中暫停代碼執行,並在控制檯中手動輸入'someVariable'並且失敗。但是,如果在執行事件之前在forEach循環中包含'someVariable',那麼'console.log'確實是正確的數據。我想這基於Javascript的關閉是有意義的。再次感謝您的解釋。 – user2209090