ES6学习日记【2】—— Arrow functions

2018-03-01 11:00:20来源:segmentfault作者:bluesboneW人点击

分享
1.箭头函数基本语法
1.1 ES3 函数语法
// 具名函数
function xxx(arg1, arg2) {
console.log(arg1)
console.log(arg2)
return arguments
}// 匿名函数(三句话)
let xxx = function (arg1, arg2) {
console.log(arg1)
console.log(arg2)
return arguments
}// 第一句话 声明xxx
// 第二句话 声明匿名函数
// 第三句话 把匿名函数赋值给xxx1.2 箭头函数语法
特点:只能做赋值,不能做声明

第一种写法【完全写法 —— 不省略参数个数,不省略函数体花括号】
1.参数个数 >= 2
2.函数体内语句个数 >= 2let xxx = (arg1, arg2) => {
console.log(arg1)
console.log(arg2)
return arg1 + arg2
}
第二种写法【省略参数括号】
1.参数只有一个
2.函数体内语句个数 >= 2
let xxx = arg1 => {
console.log(arg1)
return arg1
}
第三种写法【省略函数花括号和return】
1.参数个数 >= 2
2.函数体内语句只有一句,且这一句会被return
let xxx = (arg1, arg2) => arg1 + arg2
// 如果你加了花括号,就必须把return同时加上去才能够返回arguments
let xxx = (arg1, arg2) => {
return arg1 + arg2
}
2.为了搞定难搞的this,我们搞出了箭头函数

ES3 支持 this,关于this在ES3中的使用
请看this总结【1】—— this概览和this总结【2】—— call/apply和bind
ES6 的箭头函数弱化了this的用法


2.1 箭头函数不绑定this
在ES3里,this是Function隐藏的第一个参数
而且this是什么,是不确定的,因为每个被新定义的函数都会创建自己的this值function Person() {
// Person() 构造函数定义 `this`作为它自己的实例.
this.age = 0;setInterval(function growUp() {
// 在非严格模式, growUp()函数定义 `this`作为全局对象,
// 与在 Person()构造函数中定义的 `this`并不相同.
this.age++;
}, 1000);
}let p = new Person();不同函数里的this可能总是不一样,而且没有什么规律和逻辑,很难使用
因此,我们在调用函数的时候,高级写法就是使用call
这样,我们在代码未执行前就能确定this的值是什么function xxx(/*this,*/arg1, arg2) {
console.log(this, arg1, arg2)
}xxx.call(window, 1, 2) // Window 1 2
箭头函数里的this不会被call改变

let test1 = () => {
console.log(this)
}
test1.call({name: 'bruce'}) // window
2.2 如何使用箭头函数里的this

划重点:把箭头函数里的this当做普通变量看待!!!!
划重点:把箭头函数里的this当做普通变量看待!!!!
划重点:把箭头函数里的this当做普通变量看待!!!!


function Person() {
this.age = 0;
let a = 0
setInterval(() => {
console.log(a) // 请问a去哪儿找?Person的作用域
this.age++; // 请问this去哪儿找?Person的作用域
// 这样,|this| 就能正确地指向person对象,你也再也不用管call的第一个参数到底传的是啥了
}, 1000);
}let p = new Person();
3.使用箭头函数使得代码变得简洁

一般用于回调函数


// 把数组内每一个数都换做其平方数
// 然后再将每个数都减2
// 【使用map方法】
// 请问该怎么写??// ES3写法
let arr = [1, 3, 4, 6, 7]
arr.map(function (number) {
return number * number
}).map(function (number) {
return number - 2
})// ES6写法
arr.map(number => number * number).map(number => number - 2)4.ES6Function作为方法时的简写
let obj = {
console: function (a) {
console.log(a)
}
}
// 等价于
let obj = {
console(a) { // 删去了冒号和function关键字
console.log(a)
}
}
5.箭头函数其它知识【抄mdn的】
5.1箭头函数没有arguments
let arrow = p1 => {
console.log(arguments) // 报错:arguments is not defined
}
arrow('xxx')
5.2箭头函数不可作为构造函数且没有prototype属性
let Foo = () => 'test'
let f1 = new Foo() // 报错:Foo is not a constructor
console.log(Foo.prototype) // undefined

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台