2015-06-04 65 views
0

我已經構建了一個標準的JavaScript模塊(模式),其中包含許多 私有方法和變量。我發現在使用$.each後,我正在維護this上下文以指向我的模塊。

我知道jQuery $.each方法創建一個閉包並因此創建一個新的「上下文」,但是我確實想要繼續有this引用該模塊。我發現使用initFruit.call()調用我的模塊的私有函數(樣本中的initFruit())並傳入self副本this(即「範圍內」),該函數爲該函數工作,但是儘快該函數調用另一個函數,上下文再次丟失。

我真的不想用.call()隨時調用我所有的私有函數,因爲我使用$.each進一步調用堆棧,所以如何在不丟失原始上下文的情況下使用$.each

小提琴:https://jsfiddle.net/BloodBaz/zz11n5wp/1/

+0

我前段時間曾遇到同樣的問題。我已經問過[一個問題](http://stackoverflow.com/questions/29983887/this-returning-either-object-or-window-inside-the-same-object),也許提供的答案可以幫助你。 –

+0

謝謝@JeremyThille。有趣。你的例子是通過中介的'navigator.geolocation.getCurrentPosition'調用來傳遞子函數,在這個例子中我沒有這樣做。 –

回答

0

在定義內封閉,可替代this(比如:90%的情況下,私下「辦法」)一個範圍情況下,最簡單的方法有「全局範圍」的this元素是在您的主代碼塊的第一行中定義一個變量,通常爲self。在你的情況下,「全球」thisWindow,因此,這就是我要做的,用幾句話在你想引用對象時用「self」替代「this」,僅當你想引用內部閉包時用this

var MyModule = (function ($) { 
    var self = {}; 

    var privateFunction = function() { 
     console.log(self); 
    } 

    self.init = function() { 
     privateFunction(); // exposes all the public methods of self, keeping the "private" functions private 
    }; 

    return self; 
}(jQuery)); 

MyModule.init(); 

https://jsfiddle.net/zz11n5wp/2/

+0

謝謝。我已經稍微增加了你的例子來監視多個函數調用中的'self'和'this'。無論如何,它們都顯示出有效的「this」以及訪問其他私人項目。這表明我正在做一些*錯誤的*,因爲你的例子正在證明我想要的東西,但沒有得到。 https://jsfiddle.net/BloodBaz/zz11n5wp/5/ –

+0

如果你在一個內部範圍內,你將能夠繼續看到外部變量。這意味着您可以訪問範圍內的私有函數和變量,但是您將無法從外部訪問它們。看例子:https://jsfiddle.net/zz11n5wp/6/ 我不確定你的代碼中出了什麼問題:) – Jack

0

你可以試試功能結合到你想要的範圍是什麼?有點像下面

var self = this;  
$.each([1,2,3,4], function(index, item) { 
    // do something 
    // self === this 
}.bind(this)); 

,或者您需要舊版瀏覽器的支持,請嘗試使用像lodash什麼庫來做到這一點。或jquery's $.proxy應該工作。

https://jsfiddle.net/zz11n5wp/3/

+0

Thanks @ vernak2539。我認爲'bind()'可能在解決方案中起作用。它確實將所需的「this」呈現給匿名函數,這非常棒。但是,只要我調用'initFruit()'(和間接的'initFruitSub()'),上下文就會再次變回全局上下文。爲了保持模塊的'this',模塊內部的所有函數 - 函數調用都需要使用'.call()'或'.bind()'是否正常?謝謝。 –

+0

範圍在JS中是一件有趣的事情。它真的取決於你的情況以及函數從何處被調用。在這種情況下,您可能必須使用呼叫/申請才能獲得所需的功能。或者你可以綁定頂層的函數。說實話,所有時間綁定真的不值得(有時看起來很奇怪),只是爲了能夠使用「this」。在某些情況下混淆「這個」實際上是一個好主意 – vernak2539

相關問題