返回顶部
首页 > 资讯 > 前端开发 > node.js >在ES5环境下立即执行函数的示例分析
  • 648
分享到

在ES5环境下立即执行函数的示例分析

2024-04-02 19:04:59 648人浏览 安东尼
摘要

在ES5环境下立即执行函数的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。立即执行函数常用于第三方库,它可以用来隔离变量作用域,很

在ES5环境下立即执行函数的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

立即执行函数常用于第三方库,它可以用来隔离变量作用域,很多第三方库都会存在大量的变量和函数,在ES5环境下为了避免变量污染,开发者想到的解决办法就是使用立即执行函数。

本文就跟大家分享下立即执行函数的相关知识点,欢迎各位感兴趣的开发者阅读本文。

概念介绍

立即调用的匿名函数又被称作立即调用的函数表达式(IIFE),它类似于函数声明,但由于被包含在括号中,所以会被解释为函数表达式。紧跟在第一组括号后面的第二组括号会立即调用前面的函数表达式,位于IIFE中的代码在其外部是无法访问的。

我们举个例子来说明下:

(function() {   // 块级作用域   for (var i = 0; i < 5; i++) {     console.log(i);   } })(); console.log(i);

上述代码中当解析到console.log(i);时,会报错ReferenceError: i is not  defined,这是因为它访问的变量是在IIFE内部定义的,在外部访问不到。

在es5以前,为了防止变量定义外泄,IIFE是个非常有效的方式,这样也不会导致闭包相关的内存问题,因为不存在对这个匿名函数的引用。因此,只要函数执行完毕,其作用域链就可以被销毁。

IIFE的全称为Immediately Invoked Function Expression,翻译过来就是立即调用函数表达式。

模拟块级作用域

使用IIFE可以模拟块级作用域,即在一个函数表达式内部声明变量,然后立即调用这个函数,这样位于函数体作用域的变量就像是在块级作用域中一样(如上述例子所示)。

es6以后,新增了块级作用域的概念,因此我们想实现同样的效果,就无需再使用IIFE了,我们用let来重写下上面的例子,代码如下所示:

for (let i = 0; i < 5; i++) {   console.log(i); } console.log(i);

有关变量作用域的更多知识点请移步我的另一篇文章:深入理解作用域和闭包

块级作用域无法替代立即调用函数的表达式,当你的代码在不支持ES6+的浏览器上运行时,你不得不求助立即执行函数来模拟。

实现私有变量

IIFE可以返回一个函数引用,当这个函数在IIFE的词法范围外执行,也会创建一个闭包,使函数能够访问局部变量。

我们举个例子来说明下,如下所示:

const getOrderId = (function() {   let count = 0;   return function() {     ++count;     return `id_${count}`;   }; })(); console.log(getOrderId()); console.log(getOrderId()); console.log(getOrderId()); console.log(getOrderId());

上述代码中:

  • 创建了一个自执行函数,其返回一个函数引用

  • 自执行函数内部有一个变量count,它就是一个私有变量,外部无法访问

  • 最后,返回一个函数引用,形成闭包结构,对count自增后与_id进行拼接并返回

在IIFE之外无法访问函数内部的count变量,除了从IIFE中返回的函数,别处无法读写该变量,这样就能创建真正的私有状态变量。

变量重命名

在平常开发中可能遇到两个不同的库,他们暴露的全局变量名却是相同的,例如:正在使用Jquery,另一个库也指定了一个名为$的全局变量。

为了解决命名冲突问题,可以将一段代码封装在一个IIFE中,将一个全局变量(比如Jquery)作为参数传入IIFE,在函数内部,就可以以一个任意的参数名(比如  $)来访问该参数值,我们举个例子来说明下,如下所示:

window.$ = function somethingElse() {      // 其他代码  };     (function($) {      // 其他代码  })(jQuery);

不管在全局作用域有什么值指定给,在IIFE中,这些值都会被屏蔽,`参数一直指向Jquery方法。

捕获全局对象

javascript代码在不同环境执行时,所使用的全局对象是不同的,当代码在浏览器环境运行时,全局对象是window,但是在node环境下,全局对象则是global。

在写通用js代码时,就可以利用IIFE将其包装起来,例如:

(function(global) {      // 其他代码  })(this);

包装之后,在IIFE内部使用global时在浏览器环境下其值就是window,node环境下其值就是global。

IIFE的两种写法

立即执行函数有两种写法:

  • (function(){})() 匿名函数包裹在一个括号运算符中,后面再跟一个小括号

  • (function(){}()) 匿名函数后面跟一个小括号,然后整个包裹在一个括号运算符中

上述两种写法是等价的,要想立即执行函数做到立即执行,要注意两点:

  • 函数体后面要有小括号

  • 函数体必须是函数表达式而不能是函数声明

函数的声明方式

在讲它们两者之间的区别之前,我们先来了解下js函数的两种声明方式:表达式和声明式。

函数的声明式写法为:function  test(){},这种写法会导致函数提升,所有通过function关键字声明的变量都会被解释器优先编译,不管声明在什么位置都可以调用它,但是它本身并不会被执行。

test(); // 测试 function test() {   console.log("测试"); } test(); // 测试

函数的表达式写法为:var test = function(){},这种写法不会导致函数提升,必须先声明后调用,不然就会报错。

test(); // 报错:TypeError: test is not a function var test = function() {   console.log("测试"); };

二者的区别

现在,我们回到正题,函数表达式加上()可以被直接调用,但是把整个声明式函数用()包起来的话,则会被编译器认为是函数表达式,从而可以用()来直接调用,如(function  test(){})()。

如果将括号加在声明式函数后面如function  test(){},运行之后会报错,因为不符合js的语法,想让其通过浏览器的语法检查,就必须添加符号,比如:()、+、!等,如下所示:

function test(){   console.log("测试"); }(); // 报错 SyntaxError: Unexpected token ')'  +function test() {   console.log("测试"); }(); // 正常执行  -function test() {   console.log("测试"); }(); // 正常执行  !function test() {   console.log("测试"); }();  // 正常执行  ~function test() {   console.log("测试"); }();  // 正常执行  void function test() {   console.log("测试"); }();  // 正常执行  new function test() {   console.log("测试"); }();  // 正常执行

立即执行函数一般也写成匿名函数,使用function关键字声明一个函数,但未给函数命名,通过这种方式声明的函数就是匿名函数,例如function(){}。

匿名函数不能单独使用,否则会js语法报错,需要用()包起来,当我们需要给匿名函数传值时,写在其后面的括号即可,例如:

(function(val) {   console.log(val); }("我是匿名函数的参数"));

讲解到此处时,我们会发现,上述代码的写法正好是立即执行函数的第二种写法??,我们知道函数体后面跟着小括号,这个函数就会立即执行。

我们知道自执行函数是需要用()将其包裹起来的,前面我们讲到用()包裹起来的代码,编译器会认定它为函数表达式,因此可以在其后面加个()立即调用这个函数。同时也可以从这个括号来为匿名函数传参,代码如下所示:

(function(val) {   console.log(val); })("我是自执行匿名函数");

我们发现上述代码的写法正好是立即执行函数的第一种写法??

关于在ES5环境下立即执行函数的示例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网node.js频道了解更多相关知识。

--结束END--

本文标题: 在ES5环境下立即执行函数的示例分析

本文链接: https://lsjlt.com/news/81709.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 在ES5环境下立即执行函数的示例分析
    在ES5环境下立即执行函数的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。立即执行函数常用于第三方库,它可以用来隔离变量作用域,很...
    99+
    2024-04-02
  • javascript立即执行函数表达式IIFE的示例分析
    这篇文章主要为大家展示了“javascript立即执行函数表达式IIFE的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript立即执行函数...
    99+
    2024-04-02
  • javascript作用域链与执行环境的示例分析
    这篇文章主要介绍javascript作用域链与执行环境的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!作用域、作用域链、执行环境、执行环境栈以及this的概念在javascr...
    99+
    2024-04-02
  • JavaScript中执行环境及作用域链的示例分析
    这篇文章给大家分享的是有关JavaScript中执行环境及作用域链的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、执行环境:每个执行环境...
    99+
    2024-04-02
  • centos6.5下kvm环境搭建的示例分析
    小编给大家分享一下centos6.5下kvm环境搭建的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、关闭部分服务,关闭内核防火墙(需重启机器)chkconfig postfix offchkconfig ipt...
    99+
    2023-06-10
  • JavaScript中执行上下文的示例分析
    这篇文章主要介绍JavaScript中执行上下文的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是执行上下文?JavaScript的执行环境非常重要,当JavaScrip...
    99+
    2024-04-02
  • JavaScript自执行函数和jQuery扩展的示例分析
    这篇文章主要为大家展示了“JavaScript自执行函数和jQuery扩展的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript自执行函数...
    99+
    2024-04-02
  • JavaScript中执行上下文和执行机制的示例分析
    这篇文章主要介绍JavaScript中执行上下文和执行机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!线程和进程说js中的执行上下文和js执行机制之前我们来说说线程和进程...
    99+
    2024-04-02
  • .net环境下跨进程、高频率读写数据的示例分析
    小编给大家分享一下.net环境下跨进程、高频率读写数据的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、需求背景最近项目要求高频次地读写数据,数据量也不...
    99+
    2023-06-15
  • 在Linux环境下使用NumPy进行数据分析的最佳实践。
    在Linux环境下使用NumPy进行数据分析的最佳实践 NumPy是Python中用于科学计算的一个重要的库,它提供了高效的多维数组对象和各种用于数组操作的函数。在数据科学和机器学习领域,NumPy是必备的工具之一。本文将介绍 安装Num...
    99+
    2023-07-23
    linux numy 索引
  • Linux中Shell环境变量是否存在的示例分析
    这篇文章主要介绍Linux中Shell环境变量是否存在的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!#!/bin/bashif [ 0"$PATH" =&n...
    99+
    2023-06-09
  • 在Android打包中区分测试和正式环境的示例分析
    这篇文章主要介绍在Android打包中区分测试和正式环境的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!APK打包正式环境和测试环境注意最近在项目打包中,遇到一个问题,每次打包都要区分正式发布包和测试版本的包...
    99+
    2023-05-30
    android
  • PHP中is_writeable()函数存在Bug的示例分析
    这篇文章主要介绍了PHP中is_writeable()函数存在Bug的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP的is_w...
    99+
    2024-04-02
  • 如何在 Linux 环境下使用 Python 和 Numpy 进行实时数据分析?
    在当今时代,数据分析已经成为了非常重要的一项技能。Python 和 Numpy 是两个非常常用的工具,用于在 Linux 环境下进行实时数据分析。在本文中,我们将介绍如何在 Linux 环境下使用 Python 和 Numpy 进行实时数据...
    99+
    2023-10-29
    linux numpy 实时
  • Spring Boot jar启动时设置环境参数的示例分析
    这篇文章主要介绍Spring Boot jar启动时设置环境参数的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Spring Boot jar 启动时设置环境参数1 摘要通常在使用 Spring Boot 开...
    99+
    2023-06-15
  • JS下大批量异步任务按顺序执行的示例分析
    这篇文章主要介绍了JS下大批量异步任务按顺序执行的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言最近需要做一个浏览器的, 支持大...
    99+
    2024-04-02
  • CentOS 6.5下ZooKeeper3.4.6集群环境部署及单机部署的示例分析
    小编给大家分享一下CentOS 6.5下ZooKeeper3.4.6集群环境部署及单机部署的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!【系统】Cent...
    99+
    2023-06-03
  • 在Dockerfile的RUN指令中不执行守护进程的示例分析
    小编给大家分享一下在Dockerfile的RUN指令中不执行守护进程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!不要在你的Dockerfile中的RUN指令中执行守护进程 $ cat&nbs...
    99+
    2023-06-04
  • 在centos7下部署运行一个php项目的示例分析
    这篇文章主要为大家展示了“在centos7下部署运行一个php项目的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在centos7下部署运行一个php项目的示例分析”这篇文章吧。因为要做...
    99+
    2023-06-15
  • vue中vue-cli3环境配置和模拟json数据的示例分析
    这篇文章主要介绍vue中vue-cli3环境配置和模拟json数据的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、安装步骤以前是npm install ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作