详解JS中的立即执行函数

详解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日

相关文章

  • Element-Plus el-col、el-row快速布局及使用方法

    Element-Plus el-col、el-row快速布局及使用方法 Element-Plus是一套基于Vue3的UI框架,其中包含了el-col、el-row等快速布局组件。在本攻略中,我们将详细讲解Element-Plus中el-col、el-row的使用方法,以及如何快速进行页面布局。 el-col组件 基本用法 el-col组件用于将页面水平分成2…

    JavaScript 2023年6月10日
    00
  • js实现中文转拼音的完整步骤记录

    安装pinyin库 pinyin是一个Python库,用于将汉字转换为拼音。要在JavaScript中将汉字转换为拼音,我们将使用Pyodide,这是一个将Python运行时编译为WebAssembly的工具。 要使用pinyin库,首先需要在JavaScript中安装Pyodide。可以通过使用以下代码片段来下载和加载Pyodide: async func…

    JavaScript 2023年6月11日
    00
  • ajax结合mysql数据库和smarty实现局部数据状态的刷新方法

    实现ajax结合MySQL数据库和Smarty实现局部数据状态的刷新方法可以分为以下几个步骤: 在MySQL数据库中创建相关表格,包括存储数据的表格和用户表格(如果需要)。 在Smarty中设置模板文件,然后在Smarty配置文件中设置相关的选项,如目录、模板路径等等。 创建相应的PHP脚本,实现连接MySQL数据库,并通过SQL语句查询所需的数据。 在前端…

    JavaScript 2023年6月11日
    00
  • js闭包用法实例详解

    JS闭包用法实例详解 什么是闭包? 闭包是指有权访问另一个函数作用域中变量的函数。创建闭包的常见方式是在一个函数内部创建另一个函数。在创建的内部函数中,可以访问外部函数的参数和变量,即使外部函数已经返回退出。 为什么要使用闭包? 闭包的主要作用是作为函数工厂,可以用来封装变量和方法,使全局变量不被污染。 同时,闭包可以让一个函数访问另一个函数的局部变量,使得…

    JavaScript 2023年5月28日
    00
  • JavaScript学习点滴 call、apply的区别

    讲解“JavaScript学习点滴 call、apply的区别”的完整攻略如下: 一、call和apply的概念 在Javascript中,所有对象都可以调用call和apply方法,它们的作用都是改变函数体内this的指向。两者的区别在于传入参数的形式不同。 call和apply都是定义在Function.prototype上的方法,因此可以被所有的函数对…

    JavaScript 2023年6月10日
    00
  • 实例讲解动态加载gridview中的行及其样式

    我们来详细讲解一下如何实现“实例讲解动态加载gridview中的行及其样式”。 准备工作 在开始这个示例之前,你需要先安装以下工具和组件: .NET Framework 4.0 或以上版本 Visual Studio 2010 或以上版本 接下来,你还需要按照以下步骤创建一个新的 Web 应用程序: 打开 Visual Studio。 选择“文件” -&gt…

    JavaScript 2023年6月11日
    00
  • js中toString()和String()区别详解

    下面是详细的攻略: 标题 1. JS中toString()方法 在JS中,每个基本数据类型都内置了一个toString()方法。这个方法可以把当前对象转换为一个字符串形式,然后返回结果。toString()方法通常不需要传入参数,但是可以接受一个表示基数的参数,用于指定输出数字的基数。 2. String()函数 String()函数是JS中的一个函数,在没…

    JavaScript 2023年5月28日
    00
  • Python实现的飞速中文网小说下载脚本

    下面我将详细讲解“Python实现的飞速中文网小说下载脚本”的完整攻略。 1. 需求背景 飞速中文网是一个提供在线阅读小说的网站,但有时我们并不能在网站上稳定地阅读,此时我们可以使用 Python 实现的小说下载脚本,以便获取更加稳定的阅读体验。 2. 实现步骤 Step 1. 安装 Python 为了运行小说下载脚本,我们需要先安装 Python。我们可以…

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