【问题标题】:What way (if any) can I get the reference to anonymous function's closure in javascript?我可以通过什么方式(如果有)在 javascript 中获得对匿名函数闭包的引用?
【发布时间】:2016-01-25 22:55:20
【问题描述】:

让我们考虑一下可行的代码:

var storage = {};

(function() {
    function internalMethod1() { ...; return; }
    function internalMethod2() { ...; return; }
    storage.storedMethod = internalMethod1;
})();

storage.storedMethod();

如果internalMethod1中没有调用,有什么方法可以调用internalMethod2?换句话说,如果我只能访问其中一个函数,我可以从外部访问匿名闭包吗?

【问题讨论】:

  • 你能检查一下匿名函数内部是否调用了method1,如果没有调用method2,或者这不符合你的需要吗?
  • return internalMethod2 来自 IIFE ?

标签: javascript scope closures


【解决方案1】:

不,您不能在执行后访问私有的、未引用的范围。您需要创建另一个闭包来创建对您想要公开的任何私有方法的引用。

var storage = {};

(function() {
    function internalMethod1() { 
        return {
            internalPublic1: internalMethod2
        };
    }

    function internalMethod2() {  
        console.log('hi');
    }

    storage.storedMethod = internalMethod1;
})();

var a = storage.storedMethod();
a.internalPublic1(); //'hi'

【讨论】:

    【解决方案2】:

    尝试将 IIFE 定义为变量,从 IIFE 返回对 internalMethod2 的引用

    var storage = {};
    
    var method2 = (function() {
        function internalMethod1() { console.log(1) };
        function internalMethod2() { console.log(2) };
        storage.storedMethod = internalMethod1;
        return internalMethod2
    })();
    
    storage.storedMethod();
    
    method2();

    【讨论】:

      【解决方案3】:

      我可以从外部访问匿名闭包吗?

      没有。范围在 JS 中是私有的,绝对无法从外部访问它们(除非您使用引擎的特定于实现的调试 API……)。

      变量(包括函数)仅在同一范围及其子范围内可用。如果你想在作用域之外访问它们的值,你可以任由函数以某种方式公开它们(return,分配给全局 storage 变量等)。

      【讨论】:

      • “如果你想在范围之外访问它们,你只能任由函数以某种方式暴露它们的值(返回”这个答案如何?与下面的解决方案不同,return 用于从 IIFE 返回 internalMethod2?Bergi 是否在下面的此用户“否决”回答?如果是,“否决”的原因?
      • @guest271314:您的回答确实显示了一种公开该功能的方法,是的。不,我没有投反对票,你为什么这么认为?
      • 没有指责,也没有“这么想”;只问。当评论中没有描述时,不知道提供的答案缺少什么?尽管根据元问题/答案在 SO 中不需要为“downvote”提供“描述”,但至少在这里,希望了解“downvote”的原因,如果可能的话,通过提供的答案纠正问题;提高js 的知名度。如果未提供“否决”的理由,则很难改进帖子
      • 祝您有美好的一天!干杯!
      • 感谢各位的讨论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多