详解JS中的立即执行函数

yizhihongxing

详解JS中的立即执行函数

在JS中,立即执行函数(Immediately Invoked Function Expression,IIFE)是一种常见的函数调用方式。IIFE有许多不同的应用场景,例如定义模块、创建私有作用域等。本文将详细讲解IIFE的语法和使用场景,并提供两个示例说明。

语法

IIFE的基本语法如下:

(function () {
  // 这里是代码块
})();

在上面的代码中,IIFE定义了一个匿名函数,并立即将其执行。由于函数是匿名的,它无法被外部访问。这样可以确保函数内部的变量和函数不会污染全局作用域。

使用场景

模块定义

IIFE可以用来定义模块,将模块的代码封装在私有作用域中。这样,模块内部的变量和函数将不会与全局变量发生命名冲突。例如:

var module = (function () {
  var privateVar = '这是私有变量';

  function privateFunc() {
    console.log('这是私有函数');
  }

  return {
    publicFunc: function () {
      console.log('这是公有函数');
    },
    publicVar: '这是公有变量',
  };
})();

module.publicFunc(); // 这是公有函数
console.log(module.publicVar); // 这是公有变量
console.log(module.privateVar); // undefined
module.privateFunc(); // TypeError: module.privateFunc is not a function

在上面的例子中,IIFE定义了一个module对象,该对象具有公有变量、公有函数和私有变量、私有函数。因为私有变量和函数只在IIFE内部可访问,所以对外部来说是不可见的。

避免变量声明提升

JS中存在变量声明提升的问题,即变量声明会被提升到作用域的顶部。使用IIFE可以避免这个问题,可以将变量的声明和初始化封装在函数内部。例如:

(function () {
  var name = '小明';

  function sayHi() {
    console.log('大家好,我是' + name);
  }

  sayHi();
})();

在上面的例子中,变量name和函数sayHi都在IIFE内部定义。因为它们是函数内部的局部变量和函数,所以它们不会被声明提升到全局作用域。

示例说明

示例一:打印1-10的数字

在这个示例中,我们将使用IIFE打印数字1-10。我们可以将计数器变量封装在IIFE的内部,以便于对全局作用域中的变量进行封装。

(function () {
  for (var i = 1; i <= 10; i++) {
    (function (j) {
      setTimeout(function () {
        console.log(j);
      }, j * 1000);
    })(i);
  }
})();

在上面的代码中,我们使用了两个嵌套的函数,一个是外部的循环,另一个是立即执行函数。在循环中,我们通过将计数器变量的值传递给立即执行函数的形参来封装变量。然后,我们使用setTimeout函数在每个数字之间添加一秒延迟,并打印每个数字。

示例二:避免变量声明提升

在这个示例中,我们将使用IIFE避免函数内部变量的声明提升。

(function () {
  var name = '小明';

  function sayHi() {
    console.log('大家好,我是' + name);
  }

  sayHi();
})();

在上面的代码中,我们将变量name和函数sayHi封装在IIFE中,这样它们就只能在IIFE函数内部访问。由于它们是私有的,并且在IIFE中声明和初始化,因此它们不会被提升到全局作用域中。这样,我们就可以避免变量声明提升的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JS中的立即执行函数 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Web js实现复制文本到粘贴板

    要在Web页面中使用JavaScript实现将文本复制到剪贴板,需要使用Clipboard API。以下是实现此功能的完整攻略: 步骤一:检查浏览器兼容性 检查浏览器是否支持 Clipboard API: if (!navigator.clipboard) { console.log(‘浏览器不支持 Clipboard API.’); } 步骤二:编写复制到…

    JavaScript 2023年6月10日
    00
  • python selenium操作cookie的实现

    Python Selenium操作Cookie的实现: 引入selenium模块 from selenium import webdriver 定义浏览器对象 browser = webdriver.Chrome() 获取网站Cookie信息 browser.get(‘https://www.baidu.com’) print(browser.get_coo…

    JavaScript 2023年6月11日
    00
  • 举例讲解JavaScript中关于对象操作的相关知识

    下面我将详细讲解JavaScript中关于对象操作的相关知识: 对象的定义 JavaScript中对象是一种数据类型,它是一组无序的属性和方法的集合。JavaScript对象是键值对的集合,其中键是字符串类型的属性名,值可以是任何JavaScript的数据类型。对象可以通过字面量或者构造函数的方式进行创建。 对象的字面量创建 var person = { f…

    JavaScript 2023年5月27日
    00
  • javascript 模拟坦克大战游戏(html5版)附源码下载

    让我来详细讲解一下“javascript 模拟坦克大战游戏(html5版)附源码下载”的完整攻略。首先,这个游戏是使用html5和javascript开发的,所以我们需要了解一些前端基础知识。 1. 技术要求 HTML5 Javascript CSS 2. 游戏介绍 这个游戏是一款双人对战的坦克大战游戏,支持键盘操作。游戏的地图分为草地、钢铁墙和河流三种地形…

    JavaScript 2023年6月10日
    00
  • JS实现一个简单的日历

    下面是JS实现一个简单的日历的完整攻略。 步骤一:在HTML中添加日历的框架 我们先在HTML文件中添加一个日历的框架,可以采用表格的形式来呈现日历。以下是示例代码: <table> <thead> <tr> <th colspan="7"><span id="year&qu…

    JavaScript 2023年5月27日
    00
  • js实现鼠标切换图片(无定时器)

    JS实现鼠标切换图片(无定时器)的攻略如下: 步骤一:搭建HTML结构 首先,我们需要搭建一个HTML结构,用于展示图片和显示鼠标切换效果。具体可以参考下面的代码示例: <div class="img-wrapper"> <img src="https://picsum.photos/id/1/200/300&…

    JavaScript 2023年6月11日
    00
  • wasm+js实现文件获取md5示例详解

    “wasm+js实现文件获取md5示例详解”是一个比较复杂的项目,需要包括对wasm和js的理解,以及对md5算法的运用。下面是一个完整的攻略: 1. 项目背景 本项目是一个文件获取md5的示例,在web前端常见的场景中,为了保证文件的完整性或安全性,需要对文件进行md5加密,以此保护文件不被篡改或窃取。而在web前端实现md5加密,需要借助wasm和js的…

    JavaScript 2023年5月27日
    00
  • 详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑

    当使用Bootstrap表单验证和Bootstrap-select插件时,可能会发现在重置表单时,表单中的Bootstrap-select插件的验证提示并没有被清除,这是一个很常见的问题,本文将详细讲解如何解决这个问题。 前置知识 Bootstrap表单验证 Bootstrap表单验证是Bootstrap框架的一个组件,它可以帮助我们快速地验证表单中的数据是…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部