Home  >  Q&A  >  body text

匿名函数 - javascript 这样写(function(){})() 有什么用途?

javascript 这样写有什么用途?一般是用在什么地方

(function(){
})()
大家讲道理大家讲道理2749 days ago391

reply all(7)I'll reply

  • 黄舟

    黄舟2017-04-10 14:43:15

    全局命名空间污染与 IIFE

    总是将代码包裹成一个 IIFE(Immediately-Invoked Function Expression),用以创建独立隔绝的定义域。这一举措可防止全局命名空间被污染。

    IIFE 还可确保你的代码不会轻易被其它全局命名空间里的代码所修改(i.e. 第三方库,window 引用,被覆盖的未定义的关键字等等)。

    不推荐

    var x = 10,
        y = 100;
    
    // Declaring variables in the global scope is resulting in global scope pollution. All variables declared like this
    // will be stored in the window object. This is very unclean and needs to be avoided.
    console.log(window.x + ' ' + window.y);
    

    推荐

    // We declare a IIFE and pass parameters into the function that we will use from the global space
    (function(log, w, undefined){
      'use strict';
    
      var x = 10,
          y = 100;
    
      // Will output 'true true'
      log((w.x === undefined) + ' ' + (w.y === undefined));
    
    }(window.console.log, window));
    

    IIFE(立即执行的函数表达式)

    无论何时,想要创建一个新的封闭的定义域,那就用 IIFE。它不仅避免了干扰,也使得内存在执行完后立即释放。

    所有脚本文件建议都从 IIFE 开始。

    立即执行的函数表达式的执行括号应该写在外包括号内。虽然写在内还是写在外都是有效的,但写在内使得整个表达式看起来更像一个整体,因此推荐这么做。

    不推荐

    (function(){})();
    

    推荐

    (function(){}());
    

    so,用下列写法来格式化你的 IIFE 代码:

    (function(){
      'use strict';
    
      // Code goes here
    
    }());
    

    如果你想引用全局变量或者是外层 IIFE 的变量,可以通过下列方式传参:

    (function($, w, d){
      'use strict';
    
      $(function() {
        w.alert(d.querySelectorAll('p').length);
      });
    }(jQuery, window, document));
    

    全文阅读:前端编码风格规范之 JavaScript 规范

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:43:15

    这是匿名函数的表达方式。匿名函数的好处主要是不污染全局空间,你在该函数体内所创建的变量均为局部变量。

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:43:15

    立即执行表达式

    http://segmentfault.com/q/1010000000442042

    reply
    0
  • 阿神

    阿神2017-04-10 14:43:15

    匿名函数,里面的代码会立即执行。
    里面的变量不会和全局变量冲突,一般用来封装一些组件,把需要的接口对外暴露,方便外部调用。
    这是我的理解,请指正。。。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:43:15

    使用()将匿名函数包裹起来,就成了函数表达式.
    再在后面添加一个括号,该表达式就会执行。

    var k = function(){
                console.log(1)
            }
    k()    //执行
    
    (function(){
        console.log(1)
    })()    //自执行
    

    还有更多中匿名函数表达式的写法,可参考 javascript调用匿名函数的多种方式。

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 14:43:15

    该表达式会立即执行,而且里面用了闭包,可以避免命名冲突

    reply
    0
  • 黄舟

    黄舟2017-04-10 14:43:15

    我来补充一点,关于为什么最外层要用括号括起来。

    在javascript中有两种常用的声明函数的方法。

    1. 函数声明:

      function foo() {

      //

      }

    2. 函数表达式

      var foo = function() {

       //

      }

      如果function出现在行首,解析器会认为是一个函数声明,函数声明不能立即执行。如果要使用立即执行的函数,必须使用函数表达式。但是函数表达式的function关键字不能出现在行首,所以要用括号将整个表达式括起来。

    即:

    (function(){
    
      // Code goes here
    
    }());

    reply
    0
  • Cancelreply