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 对象

立即执行函数与Function的更多相关文章

  1. 深入理解立即执行函数(function(){})();

    ( function(){-} )()和( function (){-} () )是两种javascript立即执行函数的常见写法,要理解立即执行函数,需要先理解一些函数的基本概念. 1,函数声明,函 ...

  2. 立即执行函数(function(){})()与闭包

    立即执行函数 匿名(function(){})() 当一个匿名函数被括起来,然后再在后面加一个括号,这个匿名函数就能立即运行起来. $(function(){}) $(function(){});是$ ...

  3. JS匿名函数自执行函数

    JS匿名函数自执行函数:(function(){})();(function(){}) 这是一个函数,函数后面接(),则是调用函数 比如(function(arg){console.log(arg); ...

  4. 立即执行函数(IIFE)的理解与运用

    作为JavaScript的常用语法,立即执行函数IIFE(Immediately-Invoked Function Expression)是值得我们认真去学习探究的. 一.创建函数的两种方式 我们先从 ...

  5. jQuery 自执行函数

    jQuery 自执行函数 // 为了避免三方名冲突可将全局变量封装在自执行函数内 (function (arg) { var status = 1; arg.extend({ 'xsk': funct ...

  6. js 立即执行函数

    1.我们首先要搞明白:函数表达式和函数声明的区别. 函数表达式:既可以为匿名函数也可以有函数名,但是调用的时候都是通过函数左边的变量func来调用 var func = function(){ ale ...

  7. javaScript 立即执行函数学习笔记

    立即执行函数: 即执行函数(Immediate Functions),立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行 立即执行函数(immediate function)术语不是在ECM ...

  8. javascript的立即执行函数

    在javascript中有引入立即执行函数的概念,那么什么是立即执行函数呢?立即执行函数又是怎么写的呢?立即执行函数与普通函数有什么区别呢? 先来看看一般的函数: function a(){ var ...

  9. 立即执行函数 - Js函数笔记

    立即执行函数 定义:此类函数没有声明,在执行一次后即释放,适合做初始化. 针对初始化功能的函数,同时遵循一句话,只有表达式才能被执行符号执行 1.(function() {...}()); - W3C ...

随机推荐

  1. java函数式编程之lambda表达式

    作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...

  2. spring中log4j的使用---转载

    原文链接:http://www.codeceo.com/article/log4j-usage.html 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供 ...

  3. 我的C++笔记(函数部分)

    #include <iostream> #include <cmath>//C++的数学函数库 using namespace std; class Point{ public ...

  4. 文件类型总结 MIME

    来源网上https://www.cnblogs.com/zhongcj/archive/2008/11/03/1325293.html {".3gp", "video/3 ...

  5. Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档

    0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...

  6. centos7.XXX配置python3环境

    众做周知,centos 是自带python2.7的.可是随着社会的进步,科技的发展,技术一步步更新换代,python2.7已经不足以满足项目的需求.这时候python3横空出世. 下面跟着我来一起实现 ...

  7. 在wamp中直接进入项目

    这个问题困扰了我很久, 暂时我解决了一半. 进入localhost的页面如图一: 可以看到 我有两个projects,但是点击后会直接转跳到这样的页面 例如点击phyfitness_proj,如图二所 ...

  8. sessionStorage缓存滚动条位置

    想象在一个列表页,用户上滑页面浏览数据,点击某一条进入详情页,之后再从详情页返回列表页时不会想再从头去查看数据,这就要求我们记录用户刚刚浏览的位置,而不是重新刷新页面到了页面顶部.这里需要用到sess ...

  9. 使用Ansible安装部署nginx+php+mysql之安装mysql(3)

    三.使用Ansible安装mysql 1.mysq.yaml文件 - hosts: clong remote_user: root gather_facts: no tasks: # 安装rpm包 - ...

  10. mplayer 在线播放错误

    CPU: ARM Playing rtsp://admin:12345@192.168.1.198/mpeg4/main/ch01/av_stream.Connecting to server 192 ...