zoukankan      html  css  js  c++  java
  • (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?

    js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?

    转自:http://www.jb51.net/article/75089.htm

    这篇文章主要介绍了js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别,需要的朋友可以参考下
     

    没有区别。

    你需要明白 IIFE 的原理,我简单说一下:

    复制代码 代码如下:

    function foo() {...}     // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。
    foo();                   // 这是语句,Statement;解释器遇到语句是会运行它的。

    IIFE 并非必须,传统一点可以这么写:

    复制代码 代码如下:

    function foo() {...}
    foo();

    那么为什么要 IIFE?
    1.传统的方法啰嗦,定义和执行分开写;
    2.传统的方法直接污染全局命名空间(浏览器里的 global 对象,如 window)

    于是,开发者们想找一个可以解决以上问题的写法。那么像下面这么写行不行呢?

    function foo(...){}();

    当然是不能,但是为什么呢?因为 function foo(...){} 这个部分只是一个声明,对于解释器来说,就好像你写了一个字符串 "function foo(...){}",它需要使用解析函数,比如 eval() 来执行它才可以。所以把 () 直接放在声明后面是不会执行,这是错误的语法。

    如何把它变得正确?说起来也简单,只要把 声明 变成 表达式(Expression) 就可以了。

    实际上转变表达式的办法还是很多的,最常见的办法是把函数声明用一对 () 包裹起来,于是就变成了:

    复制代码 代码如下:

    (function foo() {...})    // 这里是故意换行,实际上可以和下面的括号连起来
    ();

    这就等价于:

    复制代码 代码如下:

    var foo = function () {...};    // 这就不是定义,而是表达式了。
    foo();

    但是之前我们说不行的那个写法,其实也可以直接用括号包起来,这也是一种等价的表达式:

    (function foo(){...}());

    所以你问有没有区别?很简单:木有~

    另外,刚才说过转变表达式的方式很多,的确还有很多别的写法,比如:

    !function foo() {...}();

    或者

    +function foo() {...}();

    这些都可以。

    我个人挺偏爱用 void 来转变表达式,因为此关键字不会有返回值。不过这一点真的没有什么要紧的,就当我“龟毛”好了……

    复制代码 代码如下:

    void function () {
        // 这里是真正需要的代码
    }();

    OK,所谓不去污染全局命名空间,是因为 IIFE 创建了一个新的函数作用域,你真正的业务代码被封装在其中,自然就不会触碰到全局对象了。如果你需要全局对象,那就 pass 给 IIFE:

    复制代码 代码如下:

    void function (global) {
        // 在这里,global 就是全局对象了
    }(this)    // 在浏览器里,this 就是 window 对象

    我在这里写过一个系列,其中一篇讲作用域和命名提升的,里面的知识点对理解 IIFE 有帮助,有兴趣的话可以继续深入阅读:http://www.jb51.net/article/75090.htm

    方式一,调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用在去调用执行
    方式二,调用函数,得到返回值。强制运算符使函数调用执行
    (function(){})(); 是 把函数当作表达式解析,然后执行解析后的函数
    相当于 var a = function(){}; a(); a得到的是函数
    (function(){}()); 是把函数表达式和执行当作语句直接执行、
    相当于 var a = function(){}(); a得到的是结果
    最终结果是一样的、
    ()只是起了 自执行的作用
    和 () 一样的还有很多
    比如 +function (){}
    这个等于 (function (){}) 一般用(function (){}) 还有个作用,就是 避免全局变量

  • 相关阅读:
    Win8系统 Python安装
    一些安卓开源框架整理
    Android 媒体键监听以及模拟媒体键盘的实现 demo
    android View 自动 GONE 问题
    Android 定时器TimerTask 简单使用
    关于Android studio 相对 eclipse 优点
    Java序列化与反序列化
    android shape的使用 边框
    Android Studio 修改 包名 package name
    Android WebView Long Press长按保存图片到手机
  • 原文地址:https://www.cnblogs.com/PheonixHkbxoic/p/5828713.html
Copyright © 2011-2022 走看看