Javascript 将引用传递到;这";匿名外部函数到传递的内部函数

Javascript 将引用传递到;这";匿名外部函数到传递的内部函数,javascript,function,namespaces,scope,Javascript,Function,Namespaces,Scope,为了维护名称空间,我有如下代码: MyNamespace = function() { var foo; //other private vars //some private functions //return certain functions which will be publicly called through MyNamespace return { "pubFunc1": function() {/*do stuff*

为了维护名称空间,我有如下代码:

MyNamespace = function() {
    var foo;
    //other private vars

    //some private functions

    //return certain functions which will be publicly called through MyNamespace
    return {
        "pubFunc1": function() {/*do stuff*/}
    }
}
function(state) {
    //do something with the passed in state
}
我希望我的一个公共函数能够将函数作为参数。传入的函数将如下所示:

MyNamespace = function() {
    var foo;
    //other private vars

    //some private functions

    //return certain functions which will be publicly called through MyNamespace
    return {
        "pubFunc1": function() {/*do stuff*/}
    }
}
function(state) {
    //do something with the passed in state
}
此函数将被传递到第一个匿名函数中。从那里,正如参数所暗示的,第一个匿名函数将把它的状态(使用
this
)传递给刚刚传入的函数。我遇到的问题是,匿名函数的
this
指的是全局
窗口
,而不是匿名函数


我真正需要的是能够传入函数,并允许它完全访问我的命名空间函数中的私有变量和函数。有人知道这样做的好方法吗?

Javascript使用词法作用域,也就是说,只有物理上位于外部函数内部的函数才能访问其作用域(
var
s)。对于外部定义的任何函数,都无法访问函数的
var
s

因此,将“private”变量转换为“protected”属性并将属性包传递给回调函数的唯一选项是:

 MyNamespace = function() {
    return {
        _foo: "something",
        _bar: "else",
        pubFunc1: function(callback) {
             callback(this._foo, this._bar) //or
             callback(this)
        }
    }
}

我不确定要如何/在何处调用哪个函数,但如果要确定此引用的
值,请使用
。调用
。应用
:。当然,您不能访问不在范围内的变量,这是不可能的。
this
的值取决于函数的调用方式。为了帮助您,在我们提出具体建议之前,我们需要确切了解您如何调用要控制的函数
this
,但您可能需要使用
.call()
,以便根据需要设置
this
指针。私有变量只能由其代码实际位于变量所在范围内的函数访问。如果您正确设置
this
,则可以访问实例变量,这样就可以使用
this
引用该对象的属性。这是否允许使用
MyNamespace之类的语法。\u foo=“something other”
?若真是这样的话,正如我所怀疑的,那个么以前的私有变量将能够受到公共函数之外的源的影响。在任何情况下,我都会将您的答案标记为正确,因为它澄清了在函数中定义的
var
s不能被外部定义的函数访问,这正是我想要做的。@rhitakorr:javascript中没有“private”和“public”属性的概念。每个属性都可以从任何地方访问。有效点。有时,我(错误地)使用这个术语来描述与其他事物相关的范围。因此,为了更好地表述这一点,是否可以通过MyNamespace访问命名空间之外的内容?顺便说一下,我所说的“private”是指那些变量,当不在return语句中时,在调用并分配给
myNamespace
的函数范围之外是不可访问的。