Jquery $。每个都会在模块闭包内更改此上下文

Jquery $。每个都会在模块闭包内更改此上下文,jquery,this,self,javascript,Jquery,This,Self,Javascript,我已经构建了一个标准javascript模块(模式),其中包含许多 私有方法和变量。我发现,在使用$之后,我正在努力维护此上下文以指向我的模块。每个 我知道jQuery$。每个方法都会创建一个闭包,从而创建一个新的“上下文”,但是我确实希望继续使用这个引用模块。我发现使用initFruit.call()调用my模块的私有函数(initFruit(),在示例中)并传入this(在范围内)的self副本对该函数有效,但是一旦该函数调用另一个函数,上下文就会再次丢失 我真的不想一直用.call()调用

我已经构建了一个标准javascript模块(模式),其中包含许多 私有方法和变量。我发现,在使用
$之后,我正在努力维护
上下文以指向我的模块。每个

我知道jQuery
$。每个
方法都会创建一个闭包,从而创建一个新的“上下文”,但是我确实希望继续使用
这个
引用模块。我发现使用initFruit.call()调用my模块的私有函数(
initFruit()
,在示例中)并传入
this
(在范围内)的
self
副本对该函数有效,但是一旦该函数调用另一个函数,上下文就会再次丢失

我真的不想一直用.call()调用我所有的私有函数,因为我使用了
$。每个
都在调用堆栈的更上层,那么如何使用
$。每个
都不会丢失我的原始上下文


Fiddle:

在范围上下文中,您定义了内部闭包来替代
这个
(比如:私有“方法”中的90%的情况),拥有“全局范围”的
这个
元素的最简单方法是在主代码块的第一行定义一个变量,通常是
self
。在你的例子中,“全局”这个
窗口
,因此我会这样做,当你想引用对象时,用“自我”替换“这个”,而
这个
仅当你想引用内部闭包时:

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

能否尝试将函数绑定到所需的作用域?有点像下面

var self = this;    
$.each([1,2,3,4], function(index, item) {
  // do something
  // self === this
}.bind(this));
或者,如果您需要较旧的浏览器支持,请尝试使用lodash之类的库。或者应该有效


我不久前也遇到过同样的问题。我已经问过了,也许提供的答案可以帮助你。谢谢@JeremyThille。有趣。您的示例是通过中介
navigator.geolocation.getCurrentPosition
调用传递子函数,本例中我没有这样做。谢谢@vernak2539。我认为
bind()
可能在解决方案中起到一定作用。它确实向匿名函数提供了所需的
这个
,这非常好。但是,只要我调用
initFruit()
(并间接调用
initFruitSub()
),上下文就会再次更改回全局上下文。对于模块内部的所有函数到函数调用,都必须使用
.call()
.bind()
来维护模块的
,这是否正常?谢谢。在JS中范围是一件有趣的事情。这实际上取决于您的情况以及从何处调用函数。在这种情况下,您可能必须使用call/apply来获得所需的功能。或者可以在顶层绑定函数。老实说,一直绑定真的不值得(有时看起来很奇怪),只是为了能够使用“this”。在某些情况下,给“this”加上别名实际上是个好主意。我稍微增加了您的示例,以便在多个函数调用中监视
self
this
。两者都显示有效的
以及访问其他私人物品的权限。这表明我做错了什么,因为你的例子说明了我想要什么,但没有得到什么。如果在内部作用域中,则可以继续在外部作用域中查看变量。这意味着您可以访问范围内的私有函数和变量,但无法从外部访问它们。参见示例:我不确定代码中出现了什么错误:)