js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 与new Function()区别?

new Function()

还是有区别的,
fn = new Function("arg1","alert(arg1)");这是新建一个函数,
Function 是一个类,类似Array,String,Number,Object 等的原型

如var arr=new Array();

而所有的function 是继承了Function的属性~~
Function是一个构造函数,用于动态构建一个函数。
function是关键字,通过function生成的函数实际上是一个Function对象实例

立即执行函数:

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

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

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

那么为什么要 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() {...}();

这些都可以。

方式一,调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用在去调用执行

方式二,调用函数,得到返回值。强制运算符使函数调用执行

(function(){})(); 是 把函数当作表达式解析,然后执行解析后的函数

相当于 var a = function(){}; a(); a得到的是函数

(function(){}()); 是把函数表达式和执行当作语句直接执行

相当于 var a = function(){}(); a得到的是结果

最终结果是一样的、

()只是起了 自执行的作用

和 () 一样的还有很多

比如 +function (){}

这个等于 (function (){}) 一般用(function (){}) 还有个作用,就是 避免全局变量

也可用 void 来转变表达式,因为此关键字不会有返回值。不过这一点真的没有什么要紧的

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

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

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

最新文章

  1. percona-toolkit 之 【pt-heartbeat】说明
  2. dom paser
  3. .net中如何使用cookie
  4. JavaScript的因为所以
  5. 我的MYSQL学习心得(八)
  6. PHP使用hash_algos函数计算哈希值,之间的性能排序
  7. scrapy 爬取当当网产品分类
  8. 【PYTHON】递加计数器
  9. 对国内AR产业的预言
  10. [Java Web学习]Tomcat启动时报war exploded: Error during artifact deployment
  11. P2634 [国家集训队]聪聪可可
  12. python数据格式化之pprint
  13. js 实现继承的6种方式(逐渐优化)
  14. 2018 CTSC&APIO 游记
  15. centos禁用ipv6
  16. Django之动态验证码的生成
  17. NFC读卡APP
  18. JS判断备忘
  19. http请求和返回的head字段
  20. bzoj 3720 Gty的妹子树 树分块?瞎搞

热门文章

  1. 3D集合图元:最小边界框/包围盒(boundingbox)
  2. 3 Python+Selenium的元素定位方法(id、class name、name、tag name)
  3. PuTTY 命令行改进 有效解决 中文乱码
  4. Ubuntu 18.04 安装 Xfce桌面和VNC的方法
  5. PHP中each与list用法分析
  6. 小白学习Spark系列六:Spark调参优化
  7. [NoiPlus2016]天天爱跑步
  8. windows电脑配置耳机只有一个耳朵响
  9. 【hdu 6438】Buy and Resell
  10. chrome安装插件,安装Postman