Javascript IIFE中声明的变量去哪里了?

Javascript IIFE中声明的变量去哪里了?,javascript,angularjs,Javascript,Angularjs,所以我明白生活的目的是把他们带出全球范围。在角度样式中,它表示要避免这种情况: /* avoid */ // logger.js angular .module('app') .factory('logger', logger); // logger function is added as a global variable function logger() { } // storage.js angular .module('app') .factory

所以我明白生活的目的是把他们带出全球范围。在角度样式中,它表示要避免这种情况:

/* avoid */
// logger.js
angular
    .module('app')
    .factory('logger', logger);

// logger function is added as a global variable
function logger() { }

// storage.js
angular
    .module('app')
    .factory('storage', storage);

// storage function is added as a global variable
function storage() { }
而是这样做:

/**
* recommended
*
* no globals are left behind
*/

// logger.js
(function() {
    'use strict';

    angular
        .module('app')
        .factory('logger', logger);

    function logger() { }
})();

// storage.js
(function() {
    'use strict';

    angular
        .module('app')
        .factory('storage', storage);

    function storage() { }
})();

我假设这使存储功能可供我稍后调用控制器。。。但是如果它不在全局范围内,它到底在哪里呢?

IIFE立即调用函数表达式的目的是模块化代码,创建独立的执行范围。Angular有一个依赖注入系统,其中指定的元素(工厂、服务、控制器、指令等)被注册,并且可以通过注入使用,而不管它们的位置如何。这是由角度FW向您提供的。有隐式和显式注入

隐式注入使用函数参数名称自动检测要注入的依赖项。这有利于开发,但会破坏小型化的、丑陋的代码。好消息是,有一些工具可以将显式注入转换为显式注入,即ng anotate。您的隐式注入代码如下所示

  // storage.js
(function() {
  'use strict';

   angular
    .module('app')
    .factory('storage',storage);

   function storage(logger) {
     // use logger
   }
})();
显式模式是您实际提供要传递的参数列表,并按其注册名称进行数组,然后将其与函数参数匹配。通过显式注入,您的代码将如下所示

// storage.js
(function() {
  'use strict';

   angular
    .module('app')
    .factory('storage', ['logger',storage]);

   function storage(logger) {
     // use logger
   }
})();


我希望这有助于

IIFE立即调用函数表达式的目的是将代码模块化,创建独立的执行范围。Angular有一个依赖注入系统,其中指定的元素(工厂、服务、控制器、指令等)被注册,并且可以通过注入使用,而不管它们的位置如何。这是由角度FW向您提供的。有隐式和显式注入

隐式注入使用函数参数名称自动检测要注入的依赖项。这有利于开发,但会破坏小型化的、丑陋的代码。好消息是,有一些工具可以将显式注入转换为显式注入,即ng anotate。您的隐式注入代码如下所示

  // storage.js
(function() {
  'use strict';

   angular
    .module('app')
    .factory('storage',storage);

   function storage(logger) {
     // use logger
   }
})();
显式模式是您实际提供要传递的参数列表,并按其注册名称进行数组,然后将其与函数参数匹配。通过显式注入,您的代码将如下所示

// storage.js
(function() {
  'use strict';

   angular
    .module('app')
    .factory('storage', ['logger',storage]);

   function storage(logger) {
     // use logger
   }
})();


我希望这有助于

从未使用过angular,但API的措辞表明,您已将
存储
作为工厂绑定到
angular
或称为
应用程序
的某种对象,并可能使用别名
“存储”
@Marty-Hmm来访问它。。。我认为这是有道理的。在这种情况下,它将允许工厂访问存储功能,但没有其他权利?从未使用过angular,但API措辞表明,您已将
存储
作为工厂绑定到
angular
或称为
应用程序
的某种对象,并可能使用别名
'storage'
@Marty对其进行访问隐马尔可夫模型。。。我认为这是有道理的。在这种情况下,它将为工厂提供对存储函数的访问权,但没有其他权利吗?那么您是说稍后我可以隐式/显式地注入存储?我想我是在问存储函数存储在哪里,但是Marty的评论帮助我理解了这一点,你的回答是一个非常有用的扩展!存储功能由angular的DI系统引用。它位于何处并不重要重要重要的是,如果您注入它,或者如果您通过应用程序请求$injector,那么您可以从angular代码中的任何位置引用它。您是说稍后我可以隐式/显式地注入存储吗?我想我是在问存储函数存储在哪里,但是Marty的评论帮助我理解了这一点,你的回答是一个非常有用的扩展!存储功能由angular的DI系统引用。它所在的位置并不重要,重要的是,如果您注入它,或者通过应用程序$injector请求,您可以从angular代码中的任何位置引用它