1.call和apply的区别是什么,哪个性能更好一些
fn.call(obj, 10, 20, 30) fn.apply(obj, [10, 20, 30]) call性能要比apply性能好一点,(尤其是传递给函数的参数超过三个的时候),所以后期研发的时候,可以使用call多一点
let arr = [10, 20, 30]
obj = {}
function fn(x, y, z) {}
fn.apply(obj, arr)
fn.call(obj, ...arr) // 基于ES6的展开运算符也可以实现把数组中的每一项一次传递给函数
2. 箭头函数与普通函数(function)的区别是什么?构造函数(function)可以使用new生成实力,那么箭头函数可以用吗?
箭头函数和普通函数的区别:
箭头函数语法比普通函数更加简洁(ES6中每一种函数都可以使用形参赋默认值和剩余运算符) 箭头函数没有自己的this,它里面出现的this是继承函数所处的上下文中的this(使用call/apply等任何方式都无法改变this的指向)
let fn = x => x + 1
// 普通函数
let obj = {
name: 'lanfeng'
}
function fn1() {
console.log(this)
}
fn1.call(obj) // {name: "lanfeng"}
// 箭头函数
let fn2 = () => {
console.log(this)
}
fn2.call(obj) //Window {parent: Window, opener: null, top: Window, length: 3, frames: Window, …}
document.body.onclick = () => {
//=> this: window不是当前操作的body了
}
// 回调函数: 把伊尼戈函数B作为实参传递给另外一个函数A,函数A在执行的时候,可以把传递进来的函数去执行(执行N次,可传值)
function each(arr, callback) {
for(let i = 0; i < arr.length; i++) {
let item = arr[i],
index = i;
// 接收回调函数返回的结果,如果是false,则结束循环
let flag = callback.call(arr,item, index)
if(flag === false) {
break;
}
}
}
each([10, 20, 30, 40], function(item, index){
// this:原始操作数组
})
3.箭头函数中没有arguments(类数组),只能基于...arg获取传递参数集合(数组)
let fn = (...arg) => {
console.log(arguments) //Uncaught ReferenceError: arguments is not defined
console.log(arg) // [10, 20, 30n]
}
fn(10, 20, 30)
4.箭头函数不能被new执行(因为箭头函数没有this,也没有prototype)