gpt4 book ai didi

javascript - 了解 IIFE

转载 作者:行者123 更新时间:2023-12-02 18:05:30 24 4
gpt4 key购买 nike

我在理解“立即调用函数表达式”(IIFE)时遇到了很多困难。

我正在尝试设计一个游戏(我现在有一个工作模型,但它不是面向对象的,我的目标是更好地设计和实现代码),并且我被告知不要使我的对象引用全局。

这就是我现在所拥有的。

var engine = new _engine();
engine.count++; //there's a lot more to the engine, I just haven't converted it yet

这是我尝试过的:

(function() { var engine = new _engine(); }());
engine.count++; //error, engine is not defined

所以现在我正在尝试这个,它有效,但我担心它可能仍然是全局性的!

var engine = (function(){ return new _engine(); }());
engine.count++; //works, but is this still global?

JavaScript 中的对象设计对我来说是一个非常新的概念,所以我想确保我正在学习正确的方法来做到这一点,并理解为什么这是有效的。

请注意,我需要能够从页面中的任何位置访问引擎。这是否需要全局?为什么全局人如此不受欢迎? (其他对象根据函数返回和 bool 变量引用引擎)

最佳答案

以下是您想要实现的可接受设计的示例。最后,您的应用程序将有一个入口点并使用一个全局变量,该变量用作应用程序的命名空间。

您可以而且可能应该在构造时使用依赖项注入(inject)(或使用注入(inject)器)将依赖项注入(inject)到对象中,而不是依赖于外部众所周知的变量。

如果您真的想编写模块化代码,请查看 RequireJS .

Engine.js

(function (ns) {
function Engine() {
}

Engine.prototype.someMethod = function () {
};

ns.Engine = Engine;
})(window.myNamespace = window.myNamespace || {});

Game.js

(function (ns) {
function Game(engine) {
this._engine = engine;
}

Game.prototype.start = function () {
this._engine.someMethod();
};

ns.Game = Game;
})(window.myNamespace = window.myNamespace || {});

app.js

//kickstart your app
(function () {
var engine = new myNamespace.Engine(),

//init the Game while injecting the engine dependency
game = new myNamespace.Game(engine);

game.start();
})();

关于javascript - 了解 IIFE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20151246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com