【问题标题】:Calling Function in Original Scope of Object在对象的原始范围内调用函数
【发布时间】:2013-05-05 15:48:26
【问题描述】:

好的,给定以下我不想修改的Javascript 代码:

(function () {

    function iWantToCallThis(){
        // Do some stuff
    }

    window.SomeObject = {

        theirfunc = function(){
            // Do some stuff
        },

        otherFuncIDontWantToCall = function(){
            // This works, but don't want to call this function.
            iWantToCallThis();
            // does other stuff
        }

    }

}());

我怎样才能像这样通过 SomeObject 的范围访问iWantToCallThis()

window.SomeObject.theirfunc = (function (func){
    iWantToCallThis();
    func.apply(this, arguments);
} (win.SomeObject.theirfunc));

尽管我认为该函数在技术上可以在其原始范围内运行,但我无权访问iWantToCallThis()。有什么方法可以在不编辑原始源代码的情况下访问该功能?

谢谢!

【问题讨论】:

  • 你不能。 iWantToCallThis 是您的自执行匿名函数的本地。这不是属性。
  • 恕我直言,Douglas Crockford 的“Private Members in JavaScript”是关于该主题的权威文章。它应该有助于说服您 Private 成员在外部无法访问,除非通过 Privileged 方法。
  • 很棒的文章@Beetroot-Beetroot,介意将其发布为答案,我会接受吗?绝对可以更好地深入解释我遇到的情况。

标签: javascript closures scope


【解决方案1】:

马修,

恕我直言,Douglas Crockford 的“Private Members in JavaScript”是关于该主题的权威文章。

它应该有助于说服您 Private 成员除了通过 Privileged 方法外是外部不可访问的。

【讨论】:

    【解决方案2】:

    简短的回答是你不能。

    长答案是,如果您改变主意不更改代码,然后返回iWantToCallThis,您最终可能会关闭。如果你经常这样做,你可能会遇到性能问题。

    【讨论】:

    • 我已经通过修改第三方源代码修复了它,但我不想诉诸于此,因为我试图让我所有的“黑客”不直接修改源代码。如果有人用新版本更新了源代码,hack 就会消失,而不是在一个单独的文件中。
    • 好点。该第三方软件是已知的 JS 框架吗?
    • 是的,它是 HighCharts。所以它很可能会经常更新。
    • 如果他们希望您能够调用它,他们会将其设为可调用方法。您可以尝试向他们提交增强请求。
    【解决方案3】:

    不,因为iWantToCallThis 既不是从 IIFE 返回的,也不是存储在像 SomeObject 和 theirfunc 这样的公共命名空间/变量中。

    当然,您可以做的,就像您在第二个块中开始做的那样,手动复制该函数的内容并重新声明它。尽管由于其作用域,这将无法自动获取函数的内容。

    【讨论】:

    • 遗憾的是,我无法重现内容,因为该函数会更改其他“非作用域”变量:(
    • 哦,好吧。那就是你的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多