12.6箭头函数

本文深入解析ES6箭头函数的语法特点与应用场景,包括不同参数形式的写法、this指向规则、与传统函数的区别,以及如何简化数组处理和变量解构赋值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是箭头函数?

箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性:

不能通过new关键字调用
没有原型, 因为不能通过new调用,所以没有原型
没有this, super,arguments和new.target绑定, new.target和super关键字是es6新增的
箭头函数中的this,取决于他的上层非箭头函数的this指向
没有arguments对象,但是可以获取到外层函数的arguments
call,apply,bind不能改变箭头函数的this指向
箭头函数语法由函数参数、箭头、函数体组成.

第一种形式: 没有参数的写法

1         /*
2             (): 空括号代表: 没有传递参数
3             函数体: console.log( 'ghostwu' ),  只有这一句话,可以不加花括号{}
4         */
5         let show = () => console.log( 'ghostwu' );
6         show();

1          //函数体只有一句话,当然也可以加花括号
2         let show = () => { console.log( 'ghostwu' ); }
3         show();

第二种形式: 带一个参数的写法

1         /*
2             第一个a 表示 参数a
3             第二个a 表示函数体a, 相当于 return a
4         */
5         let show = a => a;
6         console.log( show( 10 ) );



1         //如果函数体加了花括号,要用return
2         let show = a => { return a; };
3         console.log( show( 10 ) );
1         // 当然也可以加小括号
2         let show = (a) => { return a; };
3         console.log( show( 10 ) );



1         // let show = ( a ) => console.log( a );
2         // show( 100 ); //100
3 
4         // 当函数体有return的时候,必须要加花括号
5         let show = ( a ) => return a; //错误

第三种形式: 带2个以上参数的写法

 1         //当函数有2个以上参数的时候,一定要用小括号
 2         // let add = ( a, b ) => a + b;
 3         // console.log( add( 10, 20 ) ); //30
 4 
 5         // let add = a, b => a + b; //错误
 6         // console.log( add( 10, 20 ) );
 7 
 8         //有return需要加花括号
 9         // let add = (a, b) => return a + b; //错误
10         // console.log( add( 10, 20 ) );
11 
12         // let add = (a, b) => console.log( a + b );
13         // add( 10, 20 ); //30
14 
15         // let add = ( a, b ) => { return a + b; };
16         // console.log( add( 10, 20 ) ); //30

返回值如果是对象:

1 //返回值是对象,为了以示区分,用小括号
2 let show = name => ( { ‘user’ : name } );
3 let oUser = show( ‘ghost’ );
4 console.log( oUser.user );
1 //用了return关键字,要用花括号{}
2 let show = name => { return { ‘user’ : name } };
3 let oUser = show( ‘ghostwu’ );
4 console.log( oUser.user );

1         //对象与传参用法
2         let show = ( name, age ) => {
3             return {
4                 'uName' : name,
5                 'uAge' : age                
6             };
7         }
8         let oUser = show( 'ghostwu', 22 );
9         console.log( oUser.uName , oUser.uAge ); //ghostwu, 22

立即表达式的写法:

1         //立即表达式的写法
2         let oUser = ((name, age)=>{
3             return {
4                 "uName" : name,
5                 "uAge" : age
6             }
7         })('ghostwu', 25 );
8         console.log( oUser.uName , oUser.uAge );

箭头函数不能new

1         let User = () => 'ghostwu';
2         console.log( User() );
3         console.log( new User() ); //报错,箭头函数不能new

箭头函数中的this,取决于他的上层非箭头函数的this指向

1          //this指向他的外层window
2         // var a = 10;
3         // let user = () => {
4         //     console.log( this.a ); //this->window
5         // }
6         // user(); //10

 1          // 箭头函数中的this取决于外层函数的this
 2         function User( name ) {
 3             this.name = name;
 4             this.getName = () => {
 5                 console.log(this); //this指向oUser
 6                 return this.name;
 7             };
 8         }
 9         var oUser = new User( 'ghostwu' );
10         console.log( oUser.getName() );

箭头函数可以简化数组的处理

1         //箭头函数简化数组处理
2         // let arr = [10,100,0,3,-5];
3         // arr.sort( ( a, b ) => a - b );
4         // arr.sort( ( a, b ) => b - a );
5         // console.log( arr );

箭头函数取到的是外层的arguments

1         let show = function( name ){
2             return () => arguments[0]; // ghostwu, 箭头函数获取到的是外层的arguments
3         }
4         let fn = show( 'ghostwu' );
5         console.log( fn() );

call,bind,apply都不能改变箭头函数中this的指向

   1         var n1 = 100;
    2         var n2 = 200;
    3         let add = () => {
    4             return this.n1 + this.n2;
    5         };
    6         console.log( add.call( null ) ); //300
    7         console.log( add.apply( null ) );//300
    8         console.log( add.bind( null )() );//300

用途

变量的解构赋值用途很多。

(1)交换变量的值

let x = 1;
let y = 2;

[x, y] = [y, x];

上面代码交换变量x和y的值,这样的写法不仅简洁,而且易读,语义非常清晰。

(2)从函数返回多个值

函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。

// 返回一个数组

function example() {
  return [1, 2, 3];
}
let [a, b, c] = example();

// 返回一个对象

function example() {
  return {
    foo: 1,
    bar: 2
  };
}
let { foo, bar } = example();

(3)函数参数的定义

解构赋值可以方便地将一组参数与变量名对应起来。

// 参数是一组有次序的值
function f([x, y, z]) { ... }
f([1, 2, 3]);

// 参数是一组无次序的值
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});

(4)提取 JSON 数据

解构赋值对提取 JSON 对象中的数据,尤其有用。

let jsonData = {
  id: 42,
  status: "OK",
  data: [867, 5309]
};

let { id, status, data: number } = jsonData;

console.log(id, status, number);
// 42, "OK", [867, 5309]

上面代码可以快速提取 JSON 数据的值。

(5)函数参数的默认值

jQuery.ajax = function (url, {
  async = true,
  beforeSend = function () {},
  cache = true,
  complete = function () {},
  crossDomain = false,
  global = true,
  // ... more config
} = {}) {
  // ... do stuff
};

指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || ‘default foo’;这样的语句。

(6)遍历 Map 结构

任何部署了 Iterator 接口的对象,都可以用for…of循环遍历。Map 结构原生支持 Iterator 接口,配合变量的解构赋值,获取键名和键值就非常方便。

const map = new Map();
map.set('first', 'hello');
map.set('second', 'world');

for (let [key, value] of map) {
  console.log(key + " is " + value);
}
// first is hello
// second is world

如果只想获取键名,或者只想获取键值,可以写成下面这样。

// 获取键名
for (let [key] of map) {
  // ...
}

// 获取键值
for (let [,value] of map) {
  // ...
}

(7)输入模块的指定方法

加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。

const { SourceMapConsumer, SourceNode } = require("source-map");
资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值