ES6学习笔记(二)——函数的扩展

ES6 学习笔记 ES6 引入了许多新特性,如let/const解构表达式箭头函数Promise等,极大地提升了 JavaScript 的开发效率和代码可读性。掌握这些新特性,能够帮助我们编写更加现代化和高效的 JavaScript 代码。 阅读详情

预备知识


ES6函数的扩展

1.函数参数的默认值

ES6之前不能直接对函数的参数指定默认值。对参数y赋值:

y = y || expression

但是如果expression的结果为false,该赋值不起作用。为了避免这个问题,可以先判断参数y是否赋值了

if (typeof y === 'undefined') {
  y = 'World';
}

ES6允许直接在参数定义时,给参数赋默认值

function fun(x, y = 'hello'){
...
}

[Note]

  • 参数变量是默认声明的,所以不能用let或const再次声明。
  • 使用参数默认值时,函数不能有同名参数。
  • 参数默认值不是传值的,而是每次都重新计算默认值表达式的值。也就是说,参数默认值是惰性求值的。
function foo(x = 5) {
  let x = 1; // error
  const x = 2; // error
}

// 不报错
function foo(x, x, y) {
  // ...
}

// 报错
function foo(x, x, y = 1) {
  // ...
}
// SyntaxError: Duplicate parameter name not allowed in this context

let x = 99;
function foo(p = x + 1) {
  console.log(p);
}

foo() // 100

x = 100;
foo() // 101

与解构赋值默认值结合使用(待补充)

默认参数的位置

一般有默认值的参数放在参数中的尾部。如果不在尾部,要传入该参数的默认值,需要在此位置显示传入undefined

function f(x, y = 5, z) {
  return [x, y, z];
}

f() // [undefined, 5, undefined]
f(1) // [1, 5, undefined]
f(1, ,2) // 报错
f(1, undefined, 2) // [1, 5, 2]
函数的length属性

指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。
这是因为length属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,后文的 rest 参数也不会计入length属性。

(function(...args) {}).length // 0

如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。

(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1

作用域

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。

var x = 1;

function f(x, y = x) {
  console.log(y);
}

f(2) // 2

这里写图片描述

let x = 1;

function f(y = x) {
  let x = 2;
  console.log(y);
}

f() // 1

这里写图片描述
如果参数的默认值是一个函数,该函数的作用域也遵守这个规则。

let foo = 'outer';

function bar(func = () => foo) {
  let foo = 'inner';
  console.log(func());
}

bar(); // outer

这里写图片描述

var x = 1;
function foo(x, y = function() { x = 2; }) {
  var x = 3;
  y();
  console.log(x);
}

foo() // 3
x // 1

这里写图片描述

var x = 1;
function foo(x, y = function() { x = 2; }) {
  x = 3;
  y();
  console.log(x);
}

foo() // 2
x // 1

这里写图片描述


2.rest参数

syntax:
…variableName
e.g.

function add(...values) {
  let sum = 0;

  for (var val of values) {
    sum += val;
  }

  return sum;
}

add(2, 5, 3) // 10

[Note]

  • rest参数之后不能再有其他参数。
  • 函数的length属性不包括rest参数。

3.严格模式

ES6规定,只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错。


4.name属性

返回该函数的实际函数名。

function foo() {}
foo.name // "foo"

var f = function () {};
// f是一个匿名函数
// ES5
f.name // ""

// ES6
f.name // "f"

Function构造函数返回的函数实例,name属性值为anonymous。

(new Function).name // "anonymous"

bind返回的函数,name属性值会加上bound前缀。

function foo() {};
foo.bind({}).name // "bound foo"

(function(){}).bind({}).name // "bound "

5.箭头函数

使用箭头(=>)定义函数,var f = v => v;等价于

var f = function(v){
  return v;
}

箭头函数可以与变量解构结合使用

 const full = ({ first, last }) => first + ' ' + last;

// 等同于
function full(person) {
  return person.first + ' ' + person.last;
}

简化回调函数

// 正常函数写法
[1,2,3].map(function (x) {
  return x * x;
});

// 箭头函数写法
[1,2,3].map(x => x * x);

[Note]箭头函数

  • 函数体内this对象指向定义时所在的对象
  • 不可以当做构造函数(不能使用new命令)
  • 不可以使用arguments对象
  • 不可以使用yield命令
function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}

var id = 21;

foo.call({ id: 42 });
// id: 42

上面例子中,setTimeout的参数是一个箭头函数,这个箭头函数定义生效是在foo函数生成时,所以箭头函数里面的this指向foo对象。如果是setTimeout的参数是普通函数,真正执行的时候应该在100毫秒之后,this指向全局对象window。
箭头函数可以让setTimeout里面的this,绑定定义时所在的作用域。

function Timer() {
  this.s1 = 0;
  this.s2 = 0;
  // 箭头函数 this绑定Timer函数
  setInterval(() => this.s1++, 1000);
  // 普通函数 this指向运行时的作用域(全局对象)
  setInterval(function () {
    this.s2++;
  }, 1000);
}

var timer = new Timer();

setTimeout(() => console.log('s1: ', timer.s1), 4100);
setTimeout(() => console.log('s2: ', timer.s2), 3100);
// 注意s2会比s1先被打印出来
// s2: 0
// s1: 4

为什么箭头函数的this会绑定定义时所在的对象呢?因为它根本没有自己的this,而是引用外层的this o( ̄︶ ̄)o

// ES6
function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}

// ES5
function foo() {
  var _this = this;

  setTimeout(function () {
    console.log('id:', _this.id);
  }, 100);
}

除了this,箭头函数中也不存在arguments、super、new.target,使用的时候,指向的是外层函数对应变量。
因为没有自己的this,不能用call()、apply()、bind()这些方法去改变this指向。

未完待续。。。

详解FreeRTOS:事件标志组(高级篇—5) 事件组可以实现一对多,多对多的同步,即一个任务可以等待多个事件的发生。任务可以通过设置事件位来实现事件的触发和等待操作,FreeRTOS的事件仅用于同步,不提供数据传输功能。 阅读详情

相关推荐

光度立体三维重建——光源标定

光源标定的目的是为了确定光源方向或强度,一般利用物体表面的明暗信息、阴影信息或者反射特性三类信息中的其中一种即可,也可以将三种信息结合。采用不同标定物,是利用不同标定物的反射特性获取更加精确的光源信息。

wfengzi5的博客 1561

在javascript中使用yield

yield 关键字用来暂停和恢复一个生成器函数((function* 或遗留的生成器函数)。 /** * 在控制台每隔1秒,依次输出 * 0,1,2,3,4 */ //延迟1秒返回n function delay(n){ return new Promise(resolve => { setTimeout(() => { resolve(n) }, 1000); }) } //方案一: async + awa

sharleen84的博客 3061

STM32+OpenCV云台PID调参实战:从震荡到丝滑跟踪的进阶之路

本文详细介绍了基于STM32和OpenCV的跟踪云台PID调参实战经验。从硬件搭建、PID控制原理到调参技巧,系统讲解了如何通过调整比例、积分和微分参数解决系统震荡问题,实现从震荡到丝滑跟踪的进阶过程,特别适合电赛和嵌入式视觉控制开发者参考。

tgb3456789的博客 715

setTimeout的this指向:学习apply、call、bind

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript">

weixin_34025051的博客 539

数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案

数字IC后端实战项目案例之Innovus verify_drc DRC Violation脚本自动化修复方案

weixin_37584728的博客 4049

从零到一:ESP32-P4 PPA加速的配置陷阱与避坑指南

本文详细解析ESP32-P4结合LVGL的PPA硬件加速配置中的常见陷阱,包括内存对齐、缓冲区设置和同步机制等关键问题。提供实用的避坑指南和优化方案,帮助开发者高效启用esp32p4的PPA加速功能,显著提升图形渲染性能。

sky77的博客 396

setTimeout参数三种调用形式

setTimeout(code, millsec)两个参数均必填。code:需要执行的js代码串millsec:需要等待的时间三种调用举例说明:function show() {    alert('hello');}setTimeout(show, 1000);   -》1s后执行show函数setTimeout(show(), 1000); -》立即执行show函数setTimeout('sh...

u010134224的专栏 889

PowerDesigner16.5下载和安装教程

一、软件下载 1.下载地址(不用复制,直接点击下载链接即可):链接:https://pan.baidu.com/s/1MSnWHWt3SO2Uz5dt9AANAg提取码:z9kk 二、软件安装 1.下载安装包(包含安装文件、汉化包、注册文件) 2.下载后文件内容如下 3....

cicong2374的博客 10万+

分享一个用setTimeout语法实现的JS时钟

这个例子的使用setTimeout这个定时器函数,并结合日期对象即可做出时钟的效果。  <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>当前时间</title> </head> <body>

码小跳的博客 1122

Python | 处理CMIP6 NC数据,以tas为例

各位同学,一般在文章最后一章我们可能会做不同气候情景下变量的未来时空变化特征,类似上图。从cmip6下载的nc数据常需要转换格式、裁剪到研究区和重采样等,本期代码可以解决这类问题。

qq_48539301的博客 1384

Wafer的T7 Code是什么,怎么来的

在半导体Cim系统中,waferstart 业务需要支持 Sorter 读取 Wafer 的 T7 Code,与 MES 的 Wafer ID 进行绑定,以便向 前追溯 Wafer 历史,那么问题来了,T7code 是什么Wafer的T7 Code是一种,用于标识双面抛光的晶圆。这种标记采用二维矩阵代码符号,适用于各种尺寸的晶圆,不仅限于450mm无缺口晶圆7。T7 Code是衬底来料背面通常会有的供应商刻的追溯ID,这是一串数字和字母组成的流水码。

阿拉伯梳子的专栏 7925

ES6 函数的拓展

1.函数参数的默认值1.1 基本用法ES5函数参数没有默认值,通常这样传默认值function log(x,y) { if(typeof y === 'undefined') { y = 'world'; } console.log(x,y); };log('hello'); // hello world log('hello',false); //

TyrionJ的博客 384

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

es6学习笔记二 —— 函数和数组的扩展

函数的扩展 es6可以与解构赋值默认值结合使用,直接为函数的参数指定默认值。 function fn(x, y=123){ // 函数里的参数可以设置默认值 console.log(x, y) } fn(1, 3) //1, 3 fn(1,) //1, 123 function fn({ x=666, y=999 }){ console.log(x, y) } fn({}) //666, 999 fn(1, 2) //666, 999 //这种情况会使用默认值 //Cannot read prope

weixin_43340295的博客 150

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

es6函数的扩展

剩余语法(Rest syntax 也可以叫剩余参数)看起来和展开语法完全相同都是使用...的语法糖,不同之处在于剩余参数用于解构数组和对象。从某种意义上说,剩余语法与展开语法是相反的:展开语法将数组展开为其中的各个元素,而剩余语法则是将多个元素收集起来成为一个整体。在编程中使用最多的就是函数,在 ES5 中是用function关键字来定义函数的,由于历史原因function定义的函数存在一些问题,如this的指向、函数参数arguments等。ES6 规定了可以使用 “箭头”=>

热情、奔放、快乐编程! 1554

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ES6之函数的扩展

ES6(ECMAScript 2015)对函数进行了多方面的扩展,旨在提高代码的简洁性、可读性和功能性。

BradenHan的专栏 1215

全栈之路——前端(一):ES6之函数的扩展

学习笔记。

whu_three的博客 1947

【前端】ES6:数值扩展、对象扩展、函数扩展

但是 fun 因为是箭头函数,所以 this 不指向 obj,而是指向 fun 的外层,就是 window。按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。按照我们之前的 this 指向来判断,两个都应该指向 obj。使用自己想要的参数替换原数组内容,但是会改变原来的数组。箭头函数是 ES6 里面一个简写函数的语法方式。将一组值转化为数组,即新建数组。方法判断两个值是否是相同的值。将类数组对象转换为真正数组。

weixin_45980065的博客 1189

ES6基础-ES6的扩展

进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展。 开发环境准备: 编辑器(VS Code, Atom,Sublime)或者IDE(Webstorm) 浏览器最新的Chrome 字符串的扩展: 模板字符串,部分新的方法,新的unicode表示和遍历方法: 部分新的字符串方法 padStart,padEnd,repeat,startsWith,endsWith,includes 字...

程序员哆啦A梦,蓝胖子 5069

ES6中函数的扩展

ES6中函数的扩展一、箭头函数使用注意点二、函数的不定参数三、函数的拓展实参 一、箭头函数 let fn=(num1,num2)=>{ return num1+num2 } let fn=num1=>num1+num2 简写注意事项 省略小扩号:当参数只有一个时 省略大扩号:当函数体只有一句时, 当函数体只有一句时,且是return的返回值时,return省略 返回的对象格式:参数=>({ 对象}) let arr = [0, 1, 2, 3]; var obj = arr.ma

wb199811的博客 3486

【ES6】函数的扩展:函数的默认参数

【ES6】函数的扩展:函数的默认参数

wyh1355420282的博客 1426

es6-函数扩展

函数默认值+解构赋值 默认值:给函数参数添加默认值更加简洁。 // ES5 添加默认值 function fun (x, y) { y = y || 5; } // ES6 添加默认值 function fun (x, y = 5) { } 优点: 1.带默认值的参数写在最后,可以省略不传。 2.更新版本时,可以将默认值参数去掉。 参数的默认值还可以是变量 function fun (x...

qq_32754575的博客 4076

ES6之对象的扩展

TOC?/TOC。

BradenHan的专栏 1308

ES6中对函数的扩展

ES6一路扩展,字符串、数组、数值、对象无一“幸免”,ES6说要雨露均沾,函数也不能落下,今天,就来讲解ES6对函数的扩展。 参数的默认值 在开发中,给函数的参数指定默认值,是很普遍很常见的一个需求,我们先来回顾一下传统的实现方式,对比着看更好理解:    function person(n,a){         var ...

qq_43623970的博客 235

ES6,新增语法整理之函数的扩展

变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。setTimeout()如果是普通函数,this将指向window,箭头函数导致this总是指向函数定义生效时所在的对象(本例是{name: ‘张三’}),所以打印出来的是。由于箭头函数没有自己的this,所以当然也就不能用call()、apply()、bind()这些方法去改变this的指向。在 ES6 之前,不能为函数的参数指定默认值,通常采用如下方法实现。

m0_37749760的博客 1048

ES6入门—ES6的数组与函数

本文介绍了 babel 的概念;ES6 声明变量里面的 let、const 方法;ES6 数组的 apply 方法和扩展运算符;以及 ES6 函数参数默认值与解构赋值结合、rest 和 参数箭头函数。

weixin_44009656的博客 973
上一篇: ES6学习笔记(一)——字符串的扩展
下一篇: vue填坑之路——Day1(基础)
扬扬羊
博客等级 码龄9年 11粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值