【问题标题】:Passing reference to "this" anonymous outer function to passed inner function将对“this”匿名外部函数的引用传递给传递的内部函数
【发布时间】:2014-03-05 16:27:44
【问题描述】:

为了维护命名空间,我的代码如下所示:

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 指的是全局window,而不是匿名函数。

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

【问题讨论】:

  • 我不确定你想如何/在哪里调用哪个函数,但如果你想确定 this 指的是哪个值,请使用.call 或.apply:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。当然,您不能访问不在范围内的变量,这是不可能的。
  • this 的值取决于函数的调用方式。为了让我们为您提供帮助,在我们提出具体建议之前,我们需要确切了解您是如何调用要控制 this 的函数,但您可能需要使用 .call() 来设置this 指针根据需要。私有变量只能被其代码实际上在变量所在范围内的函数访问。如果您正确设置this,则可以很好地访问实例变量,以便可以使用this 引用该对象的属性。

标签: javascript function namespaces scope


【解决方案1】:

Javascript 使用词法作用域,也就是说,只有物理上位于外部函数内部的函数才能访问其作用域 (vars)。没有办法让函数的vars 可用于外部定义的任何函数。

因此,将“私有”变量设置为“受保护”属性并将属性包传递给回调的唯一选择:

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

【讨论】:

  • 这是否允许MyNamespace._foo = "something else" 之类的语法?如果确实如此,正如我所怀疑的那样,那么以前的私有变量将能够受到公共函数之外的来源的影响。无论如何,我将您的答案标记为正确,因为它阐明了函数中定义的 vars 不能被外部定义的函数访问,这是我想要做的。
  • @Rhitakorrr:javascript 中没有“私有”和“公共”属性的概念。每处房产都可以从任何地方访问。
  • 有效点。我最终(错误地)有时使用该术语作为与其他事物相关的范围的描述。那么,为了更好地表达,_foo 和 _bar 然后可以通过MyNamespace._foo = "changed value" 访问命名空间之外的东西吗?顺便说一下,我所说的“私有”是指这些变量,当不在 return 语句中时,在被调用并分配给 myNamespace 的函数范围之外是不可访问的。
猜你喜欢
  • 2015-05-09
  • 2021-09-21
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 2011-03-08
相关资源
最近更新 更多