如果加了花括号,但是没有 return 语句,默认会返回 undefined
const foo1 = _ => 'haha'
const foo2 = _ => { 'haha' }
const foo3 = _ => { return 'haha' }
console.log(foo1()); // haha
console.log(foo2()); // undefined
console.log(foo3()); // haha
调用两次匿名函数
a => b => a + b
就是调用了两次匿名函数
const foo1 = a => b => a + b
console.log(foo1(1)(2));
const foo2 = a => {
return b => {
return a + b
}
}
console.log(foo2(1)(2));
返回一个对象时,要加括号
const foo1 = x => {
return {
value: x
}
}
const foo2 = x => ({ value: x })
console.log(foo1(1)); // { value: 1 }
console.log(foo2(1)); // { value: 1 }
const foo3 = x => { value: x }
console.log(foo3(1)); // undefined
this 指向
this 指向定义该匿名函数的上下文
var a = 123
const obj1 = {
a: 2,
foo: _ => {
return _ => {
console.log(this.a); // this 指向定义该匿名函数的上下文,即 obj1
}
}
}
obj1.foo()() // 2
匿名函数对 this 进行绑定 优先级高于 call 对 this 进行绑定的优先级
浏览器中的全局执行上下文 与 node 中的全局执行上下文不同!!! 被这个折腾了好久 !!!
var a = 123
const foo = function () {
// 调用之后,等于是在 foo 函数下 创建一个 匿名的函数
return _ => {
console.log(this.a);
return this.a
}
}
const obj1 = { a: 2 }
const obj2 = { a: 3 }
var bar = foo.call(obj1) // 该匿名函数 是在 obj1 下创建的
bar.call(obj2) // this 指向 obj1 所有输出 2
但是,将 foo 的 function 换成 匿名函数
var a = 123
// 当前的 foo 在全局中创建
const foo = _ => {
// 调用之后,等于是在匿名函数下(该匿名函数在全局中创建,this指向全局) 创建一个 匿名的函数
return _ => {
console.log(this.a);
return this.a
}
}
const obj1 = { a: 2 }
const obj2 = { a: 3 }
var bar = foo.call(obj1) // 该匿名函数 是在 foo(匿名函数) 下创建的
// (说明匿名函数对 this 进行绑定优先级 高于 call 对 this 进行绑定的优先级)
bar.call(obj2) // this 指向全局