vue的学习笔记(12)之箭头函数
箭头函数1、箭头函数的使用2、箭头函数参数和返回值3、箭头函数中的this1、箭头函数的使用定义函数有三种方式:<script>//箭头函数:也是一种定义函数的方式//1.定义函数的方式:functionconst aaa=function () {}//2.对象字面量中定义函数const obj={bbb: function () {},ccc() {}}//3.es6中的箭头函数/
1、箭头函数的使用
定义函数有三种方式:
<script>
//箭头函数:也是一种定义函数的方式
//1.定义函数的方式:function
const aaa=function () {
}
//2.对象字面量中定义函数
const obj={
bbb: function () {
},
ccc() {
}
}
//3.es6中的箭头函数
// const ddd=(参数列表)=>{}
const ddd=()=>{}//无参写法
</script>
箭头函数(将原函数的“function”关键字和函数名都删掉,并使用“=>”连接参数列表和函数体。):
const ddd=()=>{}:()参数;{}方法体,可以直接是返回的表达式
2、箭头函数参数和返回值
当函数参数只有一个,括号可以省略;但是没有参数时,括号不可以省略。
// 无参
var fn1 = function() {}
var fn1 = () => {}
// 可变参数
var fn4 = function(a, b, ...args) {}
var fn4 = (a, b, ...args) => {}
<script>
//1.参数问题:
//1.1放入两个参数
const sum =(num1,num2)=>{
return num1+num2
}
// 1.2放入一个参数,小括号省略
const power= num=>{
return num*num
}
// 2.
// 2.1函数代码块中有多行代码时
const test=()=>{
// 1.打印一个hello Word
console.log("hello world");
// 2.打印hell vue
console.log("hello vue");
}
// 2.2函数代码块中只有一行代码时,有特殊写法
// const mul=(num1,num2)=>{
// return num1*num2
// }
const mul=(num1,num2)=> num1*num2
console.log(mul(20, 30));
// 无返回值
const demo=()=>console.log("hello world");
demo()
</script>
对于箭头函数的返回值,如果是return一个对象的话,需要特别注意:如果是单表达式要返回自定义对象时,一定要加上括号,不加括号的话会报错,因为和函数体的{ … }有语法冲突。
x => {key: x} // 报错
x => ({key: x}) // 正确
//注意,用小括号包含大括号则是对象的定义,而非函数主体
小贴士
箭头函数看上去像是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。(词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变 。)简单来说,箭头函数中的this是向外层作用域中一层层查找this的指向的,直到查到有this的定义为止。
3、箭头函数中的this
在讲箭头函数中的this的时候先来看看普通函数的this是指向什么的:
普通函数的this在声明时指向window,在调用时指向调用它的对象,如果直接调用,也指向window
通过代码试一试:
function b() {
function a(){
console.log(this)
}
let c = function() {
a()
}
let obj2 = {a,c}
obj2.a()//打印出obj2,打印出调用时的对象obj2
obj2.c()//打印出window,打印出直接调用时的对象window
}
let obj = {b}
obj.b()//使函数b内上下文this为obj
箭头函数的this在声明时指向window,在调用时指向声明时所在的上下文this。也就是说箭头函数中的this是向外层作用域中一层层查找this,查到有this的定义为止
<script>
//什么时候使用箭头函数
// setTimeout(function () {
// console.log(this)
// },1000)
// setTimeout(()=>{
// console.log(this)
// },1000)
//结论:箭头函数中的this是如何查找的
//答案:向外层作用域中一层层查找this,查到有this的定义为止
const obj={
aaa() {
setTimeout(function () {
console.log(this)//window
})
setTimeout(()=>{
console.log(this)//obj
})
}
}
obj.aaa()
</script>
也可以通过该代码练习揣摩一下:
function b() {
let a = () => console.log(this)
let c = function() {a()}
let obj2 = {a,c}
obj2.a()//打印出obj,打印出声明时的上下文,而不是调用它的对象
obj2.c()//打印出obj,打印出声明时的上下文,而不是调用时的上下文
}
let obj = {b}
obj.b()//使函数b内上下文this为obj
4、关于call,apply,bind
对于普通函数来说,这三个方法都适用:
let obj = {}
let a = function() { console.log(this) }
a.call(obj)//obj
a.apply(obj)//obj
a = a.bind(obj)
a()//obj
而对于箭头函数来说,因为箭头函数的特殊性三个方法都不适用:
let obj = {}
let a = () => { console.log(this) }
a.call(obj)//window
a.apply(obj)//window
a.bind(obj)
a()//window
箭头函数注意事项:
- 不能用作构造函数
- 不能使用arguments
- 不能作为对象的方法调用,因为还是指向上下文,而不是调用的对象
- 如果需要this操作,不能用作addEventListener里传的参数
关于箭头函数的更多知识可参阅MDN的文档:
https://developer.mozilla.org/zh-cn/docs/Web/JavaScript/Reference/Functions/Arrow_functions
更多推荐
所有评论(0)