4

考虑以下代码:

(function() {
    var a = 5;
    var someFunc = function() { ... };
    function anotherFunc() {
        ...
    };
})();

window.myGlobalObj = {
    init: function() {
        // and somehow here I want to  access to the IIFE context
    }
};

我想在我的全局对象中拥有 IIFE 的执行上下文。我确实可以访问函数表达式和对象本身,因此我可以传递或修改某些内容以使其工作(不,我不能重写对象或函数中的所有内容)。

甚至可能吗?

4

3 回答 3

2

您的 IIFE 的“内容”,即 、asomeFunc,在该函数范围内是本地的,因此您只能在该范围内访问它们。但是您可以window.myGlobalObj在 IIFE 内分配:

(function() {
    var a = 5;
    var someFunc = function() { ... };
    function anotherFunc() {
        ...
    };

    window.myGlobalObj = {
        init: function() {
           // and somehow here I want to  access to the IIFE context
        }
    };

})();

然后该init函数将可以访问这些变量,因为它们在其包含范围内。

编辑:如果您不能将定义myGlobalObj移到 IIFE 中,我唯一能想到的就是使用 IIFE 创建您从中访问的第二个全局对象myGlobalObj

(function() {
    var a = 5;
    var someFunc = function() { ... };
    function anotherFunc() {
        ...
    };

    // create a global object that reveals only the parts that you want
    // to be public
    window.mySecondObject = {
       someFunc : someFunc,
       anotherFunc : anotherFunc
    };
})();

window.myGlobalObj = {
    init: function() {
        window.mySecondObject.someFunc();
    }
};
于 2012-04-23T10:51:45.493 回答
2

我看到这是多么可行的唯一方法是使用eval模拟动态范围。这样做(注意 IIFE 必须放在全局对象之后):

window.myGlobalObj = {
    init: function() {
        // and somehow here I want to  access to the IIFE context
    }
};

(function() {
    var a = 5;
    var someFunc = function() { ... };
    function anotherFunc() {
        ...
    };

    eval("(" + String(window.myGlobalObj.init) + ")").call(window.myGlobalObj);
})();

这是关于如何使用动态范围的参考:是否可以在 JavaScript 中实现动态范围而不使用 eval?

编辑:我已经包含了一个示例来演示在 JavaScript 中使用动态范围的强大功能。你也可以玩小提琴

var o = {
    init: function () {
        alert(a + b === this.x); // alerts true
    },
    x: 5
};

(function () {
    var a = 2;
    var b = 3;

    eval("(" + String(o.init) + ")").call(o);
}());
于 2012-04-23T11:19:08.120 回答
0

不,这是不可能的。您要访问的上下文被调用closure并且只能在函数内访问(在您的情况下,匿名函数(IIFE 您如何称呼它))。有关闭包的更多信息,请关注优秀的Douglas Crockfords The Javascript 编程语言视频教程

您必须将这些属性放置到某个共享对象中。

于 2012-04-23T11:02:56.233 回答