深入理解javascript函数参数与闭包

针对“深入理解JavaScript函数参数与闭包”的攻略,我会先介绍一下函数参数的概念以及它们的类型和用法,然后再进行闭包的详细讲解和示例说明。

一、函数参数

函数参数是在函数定义时声明的,用于接受传递给函数的值。JavaScript中函数参数有两种类型:形式参数和实际参数。

1.1 形参和实参

函数定义时,使用括号包裹形参,形参不需要具体的值,其只是一个占位符,用于标识参数的类型或名称。函数在被调用时,使用实参对形参进行赋值,实参是实际传入的值。

示例:

function add(num1, num2) { // num1, num2为形参
  return num1 + num2;
}
add(1, 2); // 1, 2为实参

1.2 默认参数

在ES6中,你可以给函数的形参设置默认值。这样,当实参没有传入相应参数时,将会使用默认值。

示例:

function sayHi(name = 'default') { // name 设置默认值为'default'
  console.log(`Hello ${name}!`);
}
sayHi(); // 'Hello default!'
sayHi('Tom'); // 'Hello Tom!'

1.3 剩余参数

剩余参数可以用来代替函数当中需要的多个参数。

示例:

function sum(...args) { // 使用剩余参数...
  return args.reduce((a, b) => a + b);
}
sum(1, 2, 3, 4, 5); // 15, args = [1, 2, 3, 4, 5]

二、闭包

闭包是一个函数和其所在的环境组合而成的一个对象,该对象可以访问其定义时的环境中的变量和函数。这些变量和函数的引用被保存在闭包内,不会被垃圾回收机制回收掉。

2.1 闭包的形成

当一个嵌套的函数(内部函数)访问外部函数的变量时,闭包就形成了。下面是一个简单的示例:

function outer() {
  let a = 'hello';
  function inner() {
    console.log(a);
  }
  return inner;
}
let innerFn = outer();
innerFn(); // 'hello'

在上面的示例中,inner函数访问了外部的变量a,从而形成了闭包。

2.2 闭包的应用

闭包常用于保护变量以及封装函数。

保护变量:

function counter() {
  let count = 0; // count受到闭包保护
  return function() {
    return ++count;
  }
}
let inc = counter();
console.log(inc()); // 1
console.log(inc()); // 2
console.log(inc()); // 3

封装函数:

function createPerson(name) {
  let age = 0;
  return {
    getName() {
      return name;
    },
    getAge() {
      return age;
    },
    setAge(newAge) {
      age = newAge;
    }
  }
}
let person = createPerson('Tom');
console.log(person.getName()); // Tom
console.log(person.getAge()); // 0
person.setAge(20);
console.log(person.getAge()); // 20

在上面的示例中,createPerson函数返回一个对象,该对象包含几个方法,并使用闭包保护了age变量,同时也保护了name变量。

以上是“深入理解JavaScript函数参数与闭包”的一些内容,希望能够帮助到你。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解javascript函数参数与闭包 - Python技术站

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

相关文章

  • js动态生成唯一id的三种方法

    那么我们就来讲解一下JS动态生成唯一ID的三种方法。 1. 使用Math.random() 使用Math.random()方法可以生成一个随机数,因为它返回0到1之间的伪随机数,所以我们可以将其与当前的时间戳相乘,生成一个不太可能重复的唯一ID。 function generateUniqueID() { let uniqueID = Math.floor(…

    JavaScript 2023年6月10日
    00
  • JavaScript中判断函数、变量是否存在

    JavaScript中判断函数、变量是否存在需要使用typeof运算符。下面是判断函数、变量是否存在的完整攻略: 判断变量是否存在 if (typeof variableName !== ‘undefined’) { // 变量存在的处理逻辑 } else { // 变量不存在的处理逻辑 } 这段代码首先使用typeof运算符判断变量变量名称对应的变量是否存…

    JavaScript 2023年5月27日
    00
  • javascript求日期差的方法

    当我们需要计算两个日期之间的差值时,可以使用JavaScript中内置的方法来帮助我们进行计算。下面是一些常用函数的示例说明。 方法1:使用getTime()方法求日期差 使用new Date()创建两个日期对象 通过调用getTime()方法获取两个日期对象的时间戳 用两个时间戳相减得到日期差 示例代码如下: let date1 = new Date(‘2…

    JavaScript 2023年5月27日
    00
  • 用js来生成随机彩票号码清单

    生成随机彩票号码清单是在web开发中常遇到的问题,下面按照以下步骤来演示生成彩票号码的完整攻略: 第一步:创建HTML骨架 首先需要在HTML页面中创建一个合适的骨架。可以考虑使用以下HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta cha…

    JavaScript 2023年6月11日
    00
  • JS实现图片预加载无需等待

    为了使页面加载更快,我们可以在页面载入之前就预先加载所需要的图片资源。这个过程称为“图片预加载”。当用户访问页面时,这些图片就已经在本地缓存中了,从而不会出现因等待加载而导致页面卡顿的情况。下面是JS实现图片预加载无需等待的完整攻略。 1. 获取图片的URL列表 首先,我们需要获取要预加载的图片列表。这个列表可以是一个数组,也可以通过DOM元素获取。下面是一…

    JavaScript 2023年6月11日
    00
  • JavaScript中的E-mail 地址格式验证

    对于JavaScript中的E-mail 地址格式验证,我们可以从以下几个方面进行讲解。 1. E-mail地址的合法性 一个合法的E-mail地址应当包含“@”符号,且“@”符号前后应当至少包含一个字符,并且“@”符号后应当包含一个“.”符号。另外,E-mail地址中不允许出现空格、制表符和换行符等空白符号。 在JavaScript中,我们可以使用正则表达…

    JavaScript 2023年5月19日
    00
  • 微信小程序开发入门基础教程

    微信小程序开发入门基础教程 前言 微信小程序是一种全新的应用形态,可以在微信中打开,使用前端技术进行开发。相比传统APP而言,微信小程序不需要安装,用户可以直接通过微信扫描二维码或者搜索来使用。本文将从基础入门开始,介绍微信小程序的开发过程。 准备工作 在开始微信小程序开发之前,需要准备好以下环境:1. 微信开发者工具,可以在这里下载。2. 微信公众平台账号…

    JavaScript 2023年5月27日
    00
  • js读取注册表的键值示例

    下面我将详细讲解“js读取注册表的键值示例”的完整攻略。 什么是注册表 在Windows操作系统中,注册表是一种存储操作系统和应用程序配置信息的数据库。它是一个层次结构,由各种键和值组成。某些常用应用程序的配置信息也将在该注册表中保存。 读取注册表键值的方法 在JavaScript中,读取注册表的键值可以通过Windows Script Host提供的COM…

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