zoukankan      html  css  js  c++  java
  • 锱铢必较,从(function(){}())与(function(){})()说起

      今天做JsHint时,碰到一个警告:应该使用(function(){}())而不是(function(){})();看到这个我心想,这两种函数自执行有什么区别吗?自执行用了这么久,感觉对其理解仍然有点迷糊。于是,开始了一波百度。百度了一波后,再加上自己的一点理解对其终于有了一点眉目。

       如果我们想要写一个自执行函数,第一反应会这样写:

     ;function(){/*函数内容*/}()  //然而,这样是会报错的。原因是当写一个匿名函数体之后,浏览器会将其当成是函数的声明,而不是函数表达式  

    对此,网上也有很多消除函数声明和函数体歧义的方法进行自执行。如:

     +function(){/*函数内容*/}()  //返回NaN

    !function(){/*函数内容*/}() //返回false

    void function(){} //返回undefined

    再说(function(){}())与(function(){})()。其实从理论上讲,这两种写法都是可行的,只是细细探究的话,会发现二者的过程是不同的。

    (function(){}()) //和上文的一些方法一样,即自执行,将函数作为表达式执行;

    (function(){})() //则可以分开来看:

    (function(){}) //相当于: var foo = function(){}; 然后, foo();

    看起来都是可行的。但是至于JsHint为什么要求使用(function(){}()),个人感觉是因为 (function(){}()) 少了先将function(){}保存这一步,可能内存消耗较少(还请各位指教O(∩_∩)O)。另一方面,从代码规范上将,前者写法看到()将function包起来就能知道是自执行,根本不用看到最后还有个括号才能判断是自执行。

     

  • 相关阅读:
    bootstrap表头固定
    JS:二维数组排序和获取子级元素
    JavaScript 变量声明提升
    一道经典面试题-----setTimeout(function(){},0)
    排序
    基础知识:Promise(整理)
    几个兼容相关的重要函数
    JSON
    关于由ajax返回的数据在for循环中只能取到最后一个数的问题
    如果要遍历除了for循环,你还知道什么?——JavaScript的各种遍历方式
  • 原文地址:https://www.cnblogs.com/boanyi/p/zizhixing.html
Copyright © 2011-2022 走看看