`

javascript IIFE 的原理

 
阅读更多

你需要明白 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() {...}();

这些都可以。

分享到:
评论

相关推荐

    前端开源库-cjs2iife

    `cjs2iife` 开源库的工作原理是解析 CommonJS 模块,将其转换成符合 IIFE 形式的代码,这样就可以在浏览器环境中运行。这个转换过程可能涉及到对 `require()` 和 `exports` 的处理,将它们转换为适合浏览器环境的...

    js 逆向实战之分离式 webpack 非 IIFE 改写

    JavaScript 逆向实战之分离式 Webpack 非 IIFE 改写详解 在 JavaScript 逆向实战中,了解 Webpack 的工作机制及其模块加载器是非常重要的。下面,我们将详细介绍 Webpack 非 IIFE 改写的实现原理和实战案例。 ...

    JavaScript作用域原理(二) 预编译[9 29]

    JavaScript作用域原理是编程中的重要概念,它关乎变量的可见性、生命周期以及代码组织。本文将深入探讨JavaScript的作用域机制,特别是预编译的概念。在理解这些知识点之前,建议先回顾一下JavaScript的基础语法。 ...

    Logit:再次尝试 javascript,试图让 IIFE 工作

    理解IIFE的工作原理是JavaScript学习过程中的关键一步,因为它在模块化、闭包以及避免全局变量冲突等方面都发挥着重要作用。 在压缩包文件"Logit-master"中,可能包含的是一个示例项目或教程,旨在帮助理解如何在...

    davidBowie-IIFE:封装囊封IIFE

    通过分析项目中的代码,你可以更深入地理解IIFE的工作原理及其在JavaScript项目中的应用。 总之,IIFE是JavaScript中一个重要的概念,它帮助开发者维持代码的整洁性和隔离性,同时也为模块化提供了基础。通过深入...

    JavaScript书籍(JavaScript模式.pdf+JavaScript高效图形编程.pdf)

    2. **模块模式**:介绍如何组织和封装代码,以避免全局变量污染,如立即执行函数表达式(IIFE)、CommonJS、ES6模块等。 3. **设计模式**:讲解经典的面向对象设计模式,如单例、工厂、观察者等,并讨论如何在...

    JavaScript 入门与提高

    函数表达式和立即调用的函数表达式(IIFE)也是JavaScript中的重要概念,它们可以用来创建私有变量和模块化代码。此外,还要掌握事件处理,JavaScript通过事件监听、事件触发和事件传播机制,实现了用户与页面的交互。...

    JavaScript忍者秘籍1

    7. **应用程序和库的视角**:不仅讲解语言基础,还提供了从更高层次看JavaScript应用和库的视角,帮助读者理解常见库(如jQuery)的工作原理。 8. **代码优化与性能**:探讨如何编写高效、可维护的JavaScript代码,...

    javascript真经悟透

    闭包的原理基于JavaScript的作用域链,每个函数在创建时都会形成一个作用域链,这个链连接了函数内部的局部作用域和外部作用域,直到全局作用域。当函数返回时,如果内部函数引用了外部的变量,那么这个内部函数就会...

    javascript电子教案ppt

    8. **闭包**:理解闭包的原理和用途,它是JavaScript中一个强大的特性。 9. **异步编程**:回调函数、Promise和async/await,这些是处理非阻塞操作的关键。 10. **AJAX**:异步JavaScript和XML,用于在不刷新整个...

    JavaScript 脚本程序设计

    此外,函数表达式和立即调用的函数表达式(IIFE)也是JavaScript中常见的编程模式,这些都会在教程中有所涉及。 DOM(Document Object Model)是JavaScript处理HTML和XML文档的标准接口。学习者将学习如何使用...

    高性能JavaScript 2015

    3. **函数与作用域**:深入解析JavaScript的函数和作用域机制,包括立即执行函数表达式(IIFE)、闭包以及作用域链,以减少内存占用和提高执行效率。 4. **数据结构与算法**:高效的代码往往离不开良好的数据结构和...

    JavaScript内部测试题1

    JavaScript,作为全球最广泛使用的编程语言之一,是前端开发的核心技术。这门动态类型的脚本语言在网页交互、用户界面动态化...通过解答这些测试题,你可以深入理解JavaScript的工作原理,并提高解决实际问题的能力。

    JavaScript the good parts 经典课程

    理解函数的作用域、闭包和立即调用的函数表达式(IIFE)对于编写高效代码至关重要。 3. **对象和原型**:JavaScript的面向对象特性基于原型,而不是类。理解如何创建和操作对象,以及原型链的工作原理,可以帮助你...

    JavaScript范例.part06

    函数表达式,如匿名函数和立即调用的函数表达式(IIFE),是JavaScript编程中常见的技巧,用于封装变量和逻辑,防止全局污染。 2. **面向对象编程**:JavaScript采用基于原型的面向对象模型,而不是传统的类。我们...

    jquery之父写的javascript

    - **事件处理机制**:深入探讨了JavaScript中的事件驱动编程模型,包括事件绑定、委托等技术,帮助读者更好地理解浏览器事件循环的工作原理。 - **错误调试与处理**:对于JavaScript开发来说,调试和异常处理是必...

    JavaScript面向对象编程指南(第2版).rar

    6. 封装与模块化:如何使用闭包和立即执行函数表达式(IIFE)来实现封装,以及AMD、CommonJS和ES6模块系统。 7. 继承模式:浅谈原型链继承、寄生组合继承、原型式继承等常见的JavaScript继承模式。 8. 多态实践:...

    The Principles of Object Oriented.JavaScript

    《面向对象的JavaScript原则》是一本非常实用的书籍,它不仅介绍了面向对象的基本原理,更重要的是教会读者如何在JavaScript这种特殊的语言环境中运用这些原则。通过对封装、继承、多态等概念的学习和实践,开发者...

    [JavaScript][PDF][英文版]Oh My JS

    5. Patterns and Code Organization(模式和代码组织):这部分内容讲解了在JavaScript编程中如何组织代码,包括模块化、模块模式、立即执行函数表达式(IIFE)等。 ***mon JavaScript "Gotchas"(常见的JavaScript...

    effective javascript-中文-带书签

    4. **函数**:深入理解函数表达式、函数声明、闭包和立即执行函数(IIFE),这些都是JavaScript中的重要概念。了解如何使用arguments对象,以及如何利用rest参数和默认参数来优化函数签名。 5. **异步编程**:...

Global site tag (gtag.js) - Google Analytics