说一说es6中箭头函数?
没有this、this是从外部获取、不能使用new、没有arguments、没有原型和super
标准回答
箭头函数相当于匿名函数,简化了函数定义。箭头函数有两种写法,当函数体是单条语句的时候可以省略{}和return。另一种是包含多条语句,不可以省略{}和return。
箭头函数最大的特点就是没有this,所以this是从外部获取,就是继承外部的执行上下文中的this,由于没有this关键字所以箭头函数也不能作为构造函数, 同时通过 call() 或 apply() 方法调用一个函数时,只能传递参数(不能绑定this),第一个参数会被忽略。箭头函数也没有原型和super。不能使用yield关键字,因此箭头函数不能用作 Generator 函数。不能返回直接对象字面量。
call()
apply()
加分回答
箭头函数的不适用场景:
定义对象上的方法
当调用dog.jumps 时,lives 并没有递减。因为 this 没有绑定值,而继承父级作用域。
dog.jumps
lives
this
var dog = { lives: 20, jumps: () => { this.lives--; } }
不适合做事件处理程序
此时触发点击事件,this不是button,无法进行class切换
var button = document.querySelector('button'); button.addEventListener('click', () => { this.classList.toggle('on'); });
箭头函数函数适用场景:
简单的函数表达式,内部没有this引用,没有递归、事件绑定、解绑定,适用于map、filter等方法中,写法简洁
var arr = [1,2,3]; var newArr = arr.map((num)=>num*num)
内层函数表达式,需要调用this,且this应与外层函数一致时
let group = { title: "Our Group", students: ["John", "Pete", "Alice"], showList() { this.students.forEach( student => alert(this.title + ': ' + student) ); } }; group.showList();
箭头函数两种使用语法
var fn1 = num => num*num; var fn2 = (num1,num2) => { return num1+num2;}
箭头函数没有自己的 arguments 对象,这不一定是件坏事,因为箭头函数可以访问外围函数的 arguments 对象:
function constant() { return () => arguments[0] } var result = constant(1); console.log(result()); // 1
箭头函数访问自己的参数,可以通过命名参数或者 rest 参数的形式访问参数:
let nums = (...nums) => nums;
不能使用new关键字,使用报错
var Foo = () => {}; var foo = new Foo(); // TypeError: Foo is not a constructor
prototype属性为undefined
var Foo = () => {}; console.log(Foo.prototype); // undefined
不能直接返回对象字面量,用params => {object:literal}这种简单的语法返回对象字面量是行不通的。
params => {object:literal}
var func = () => { foo: 1 }; // Calling func() returns undefined! var func = () => { foo: function() {} }; // SyntaxError: function statement requires a name
这是因为花括号({} )里面的代码被解析为一系列语句(即 foo 被认为是一个标签,而非对象字面量的组成部分)。
{}
foo
所以,记得用圆括号把对象字面量包起来:
var func = () => ({foo: 1});
(1)箭头函数没有自己的this对象
(2)不可以当作构造函数,也就是说,不可以对箭头函数使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
得分点
没有this、this是从外部获取、不能使用new、没有arguments、没有原型和super
参考答案
标准回答
箭头函数相当于匿名函数,简化了函数定义。箭头函数有两种写法,当函数体是单条语句的时候可以省略{}和return。另一种是包含多条语句,不可以省略{}和return。
箭头函数最大的特点就是没有this,所以this是从外部获取,就是继承外部的执行上下文中的this,由于没有this关键字所以箭头函数也不能作为构造函数, 同时通过
call()
或apply()
方法调用一个函数时,只能传递参数(不能绑定this),第一个参数会被忽略。箭头函数也没有原型和super。不能使用yield关键字,因此箭头函数不能用作 Generator 函数。不能返回直接对象字面量。加分回答
箭头函数的不适用场景:
定义对象上的方法
当调用
dog.jumps
时,lives
并没有递减。因为this
没有绑定值,而继承父级作用域。不适合做事件处理程序
此时触发点击事件,this不是button,无法进行class切换
箭头函数函数适用场景:
简单的函数表达式,内部没有this引用,没有递归、事件绑定、解绑定,适用于map、filter等方法中,写法简洁
内层函数表达式,需要调用this,且this应与外层函数一致时
延伸阅读
箭头函数两种使用语法
箭头函数没有自己的 arguments 对象,这不一定是件坏事,因为箭头函数可以访问外围函数的 arguments 对象:
箭头函数访问自己的参数,可以通过命名参数或者 rest 参数的形式访问参数:
不能使用new关键字,使用报错
prototype属性为undefined
不能直接返回对象字面量,用
params => {object:literal}
这种简单的语法返回对象字面量是行不通的。这是因为花括号(
{}
)里面的代码被解析为一系列语句(即foo
被认为是一个标签,而非对象字面量的组成部分)。所以,记得用圆括号把对象字面量包起来: