资讯专栏INFORMATION COLUMN

js立即执行函数: (function ( ){...})( ) 与 (function ( ){.

xbynet / 1350人阅读

摘要:你需要明白的原理,我简单说一下这是定义,定义只是让解释器知道其存在,但是不会运行。这是语句,解释器遇到语句是会运行它的。

在SF上看到这样一个问题,我觉得问得很好,所以弄成文章收集了。

没有区别。

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

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

foo();                   // 这是语句,Statement;解释器遇到语句是会运行它的。

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

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

那么为什么要 IIFE?

传统的方法啰嗦,定义和执行分开写;

传统的方法直接污染全局命名空间(浏览器里的 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 对象

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85998.html

相关文章

  • 进击的 JavaScript(五) 之 立即执行函数闭包

    摘要:匿名函数是不能单独写的,所以就提不上立即执行了。六立即执行函数在闭包中的应用立即执行函数能配合闭包保存状态。来看下上节内容中闭包的例子现在,我们来利用立即执行函数来简化它第一个匿名函数执行完毕后,返回了第二个匿名函数。 前面的闭包中,提到与闭包相似的立即执行函数,感觉两者还是比较容易弄混吧,严格来说(因为犀牛书和高程对闭包的定义不同),立即执行函数并不属于闭包,它不满足闭包的三个条件。...

    vincent_xyb 评论0 收藏0
  • 模块化、闭包立即执行函数的使用、MVC里的V和C

    摘要:模块化里的和闭包与立即执行函数的使用这篇文章记录我写在线个人简历过程中学习的知识完整代码暂未完成预览地址轮播组件的使用英文官网中文网使用方法模块化学习写代码的方法抄运行修改模块化把对应功能放到块里面这个块可以是文件或者或者别的等等立即执 模块化、MVC里的V和C、闭包与立即执行函数的使用 这篇文章记录我写在线个人简历过程中学习的知识完整代码(暂未完成)预览地址 轮播Swiper组件的使...

    2501207950 评论0 收藏0
  • js函数声明函数表达式的区别以及立即执行函数

    摘要:最近在写代码时遇到了闭包,其中闭包又和立即执行函数有点关系,于是牵扯除了函数声明以及函数表达式,我感觉中文的很多文章写的不太好,查阅了的指南和这篇关于的文章,觉得写的很好,整合一下。函数声明和函数表达式。 最近在写代码时遇到了闭包,其中闭包又和立即执行函数(immediately invoked function expression, aka IIFE)有点关系,于是牵扯除了函数声明...

    madthumb 评论0 收藏0
  • javascript自执行函数

    摘要:一般没有问题,但是,建议在自己写的立即执行函数前加分号,这样可以有效地与前面代码进行隔离。否则,可能出现意想不到的错误。自执行函数前加个分号是什么意思写法最前最后加括号推荐这种写法外面加括号目前很多比较好的使用的都是第二种方式。 定义 立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行,这种模式本质上就是函数表达式(命名的或者匿名的),在创建后立即执行;立即执行函数(imme...

    tuantuan 评论0 收藏0
  • 自调用匿名函数(匿名闭包)解析调用

    摘要:打开源码,首先你会看到这样的代码结构这是一个自调用匿名函数。模式,是自执行函数的高级模式,可以非常方便的在各个匿名闭包中以全局对象调用闭包函数。 打开jQuery源码,首先你会看到这样的代码结构: (function(window,undefined ){ // })(); 这是一个自调用匿名函数。什么东东呢?在第一个括号内,创建一个匿名函数;第二个括号,立即执行 为什么要创建这样一个...

    Scorpion 评论0 收藏0

发表评论

0条评论

xbynet

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<