【问题标题】:HotTowel Angular and Immediately-Invoked Function Expression (IIFE)HotTowel Angular 和立即调用函数表达式 (IIFE)
【发布时间】:2015-01-08 06:15:52
【问题描述】:

开始查看 AngularJS 的 HotTowel 模板,所有这些“为什么”的问题都在我脑海中浮现。我已经清除了其中一些,但无法清除这个。 IE。对控制器使用“立即调用函数表达式 (IIFE)”。下面是来自“shell.js”的代码

    (function () { 
        'use strict';

        var controllerId = 'shell';
        angular.module('app').controller(controllerId,
            ['$rootScope', 'common', 'config', shell]);

        function shell($rootScope, common, config) {
            var vm = this;
      //rest of the code omitted 

我不明白为什么在这里使用 IIFE。一个原因可能是如果我们不使用 IIFE,那么

var controllerId = "shell"

将具有全局范围(对吗?)。我试图删除 IIFE 样式,显然它没有任何问题。我浏览了AngularJS Style Guide,但在那里找不到解释。有人可以解释一下我们采用这种方法可以获得什么好处吗?

附:如果您认为这不是此问题的正确位置,请指出正确的位置。

【问题讨论】:

    标签: javascript angularjs hottowel


    【解决方案1】:

    正如您所说,这是为了防止添加到全局范围。在您上面的代码中,controllerIdshell 函数将在不使用 IIFE 时添加到全局范围内。

    John Papa's style guide中有解释:

    为什么?:IIFE 从全局范围中删除变量。这有助于 防止变量和函数声明的寿命超过 在全局范围内预期,这也有助于避免变量 碰撞。

    为什么?:当您的代码被压缩并捆绑到一个文件中时 部署到生产服务器,你可能会有冲突 变量和许多全局变量。 IIFE 可以保护您免受两者的侵害 通过为每个文件提供变量范围来实现这些。

    【讨论】:

    • 这回答了你的问题吗?
    • 那么如果我们不使用这个var controllerId = "shell",那我们就不需要IIFE了?除了声明控制器ID,IIFE在控制器声明中还有哪些情况会更好?
    • 好的,另一个地方是我在指令声明中看到的, var app = angular.module('app');当我们需要对应用程序的引用时使用。如果不是使用 IIFE 的本地范围,那么我们将不得不命名 app1、app2... 十几个名称来在指令/服务中引用应用程序
    • 是一样的。这是为了防止将应用程序添加到全局范围。您实际上不应该使用var app =,因为您应该只为每个文件声明一个指令,因此无需再次引用引用应用程序。 style guide中也提到了这一点。
    猜你喜欢
    • 2012-12-28
    • 2023-04-04
    • 2016-05-04
    • 1970-01-01
    • 2017-08-30
    • 2012-09-02
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多