gpt4 book ai didi

javascript - 立即调用没有任何私有(private)变量或返回值的函数表达式?

转载 作者:行者123 更新时间:2023-11-30 18:19:33 24 4
gpt4 key购买 nike

我正在阅读 javascript 设计模式这本书,并在阅读“命令模式”时遇到了下面的代码。我一直在试图理解为什么这段代码被包裹在一个立即被调用的匿名函数周围,特别是因为没有其他私有(private)变量可以关闭。这与仅将 CarManager 声明为对象文字有何不同?

(function(){

var CarManager = {

// request information
requestInfo: function( model, id ){
return 'The information for ' + model + ' with ID ' + id + ' is foobar';
},

// purchase the car
buyVehicle: function( model, id ){
return 'You have successfully purchased Item ' + id + ', a ' + model;
},

// arrange a viewing
arrangeViewing: function( model, id ){
return 'You have successfully booked a viewing of ' + model + ' ( ' + id + ' ) ';
}

};

})();

最佳答案

这个例子有点不成熟。

目标是能够提供一个公共(public)接口(interface)。在该 IIFE 中,您将界面所需的所有部分放在一起。

您不必通过返回语句将其传回。

例如,jQuery 就是以相同的方式构建的。而不是返回语句:

var jQuery = (function () { return magic; }());

他们从函数内部手动设置 windowjQuery(和 $)属性,如下所示:

(function () { window["jQuery"] = magic; }());

此外,实际发生的事情还是有点不同。他们将 window 对象传递给 IIFE 的 window 参数。那么它不一定是 window。理论上,它可以是您要扩展的任何先前定义的对象。

var myApp = {};
(function (window, document) { window["jQuery"] = public_interface; }(myApp, document));
myApp.jQuery("...");

在构建类似于 jQuery 的库时,您可以做类似的事情。如果您通常为任何大型库/应用程序命名空间(一个好主意),您可以在内部缩短名称,以使生活更轻松。

代替:

var NAMESPACED_AWESOME_APP_OF_DOOM = {};NAMESPACED_AWESOME_APP_OF_DOOM.module1 = {};

你可以这样做:

(function (namespace) {

var ns = {};
window[namespace] = ns;

ns.module1 = {};
ns.module2 = {};
ns.service1 = function () {};

}("NAMESPACED_AWESOME_APP_OF_DOOM"));

然后您可以在内部进行所有内部设置,设置完成后,您可以在全局范围内按名称引用该应用程序。

在其他情况下,您可以为代码创建沙箱,以这种方式使用闭包,并使用中介在组件之间来回发送消息。尼古拉斯·扎卡斯 (Nicholas Zakas) 就此进行了几次精彩的演讲。

最后,有时您只想完成一些工作,这与您程序的其余部分 100% 无关,但仍然需要完成,都是一样的(比如进行兼容性检查并将结果与DOM 元素,la Modernizr... ...或设置只需要存在的 cookie,或触发对分析软件的调用... ...等等)。

关于javascript - 立即调用没有任何私有(private)变量或返回值的函数表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12443932/

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