混淆javascript自我调用函数结构

时间:2016-10-13 11:42:41

标签: javascript

我没有那么多使用javascript,所以我对以下代码结构感到困惑。代码来自外部javascript文件,init函数从索引页面调用为" windows.Ux.init(xxx)"。我知道它的自我调用功能,我认为" windows" object作为参数传递给该函数。我假设" exports.Ux" line声明名称空间并为命名空间中的两个变量分配函数。我的假设是否正确?

( function( exports ) {
   ...
   function init(x) {
   ...
   }
   ..
   exports.Ux = {
      init: init,
      clear: clear
   };

})( window );

3 个答案:

答案 0 :(得分:3)

  

我知道它的自我调用功能......

它是立即调用的函数表达式(" IIFE")。 (自调用函数将是递归的。)

  

......我假设" windows" object作为参数传递给该函数。

window全局的值传递给它,是的。在浏览器上,它是对全局对象的引用。该值在函数的exports参数中被接收。

  

我假设" exports.Ux" line声明名称空间并为命名空间中的两个变量分配函数。

不,它创建一个可通过对象Ux引用的exports属性访问的对象(在这种情况下是全局对象)。对象Ux引用具有引用函数的属性(松散地,"方法")。

答案 1 :(得分:3)

此代码段定义了一个功能:

(function( exports ) {
  // ...
})

立即使用参数window

调用它
(function ...)(window);

您可以将此调用的效果视为:

  • 使用名为initclear
  • 的属性创建对象
  • 将此对象指定给exports.Ux

您的函数接受一个名为exports的参数,并使用单个参数window调用它,因此您可以考虑立即调用的函数调用:

window.Ux = {
  init: init,
  clear: clear
}

window是Web浏览器JavaScript环境中的全局根对象。

答案 2 :(得分:3)

这称为IIFE

( function( exports ) {
   ...
   function init(x) {
   ...
   }
   ..
   exports.Ux = {
      init: init,
      clear: clear
   };

})( window );
  1. 您正在传递窗口对象作为您的参数:
  2. 第二个exports.Ux是你的曝光,意味着任何不属于exports.Ux的东西都不在外面。 Encapsulation
  3. 因此,如果您的IIFE具有以下结构:

    ( function( exports ) {
           ...
           function init(x) {
           //you can use it here somePrivate()
           ...
           }
           function somePrivate(){
    
           }
           ..
           exports.Ux = {
              init: init,
              clear: clear
           };
    
     })( window );
    

    somePrivate功能不会通过window对象向外界展示,但您可以在其他function内使用它。