1.call 和 apply异同
1)都是Fuction原型上的方法(每个方法的实例都能调用原型上的方法)
2)都是用来改变this指向,
区别:
call是一个个传参,apply是数组传参
(当参数多时,call的性能更好一点点,可以忽略不计....)
用法:
fn.call(obj, param1, params2, params2)
fn.apply(obj, [param1, params2, params2])
例子:
let arr = [1,2,3]
let obj = {}
function fn(x,y,z){}
fn.apply(obj, arr)// x=1, y=2, z=3
fn.call(obj, arr) //x=[1,2,3], y=undefined, z=undefined
fn.call(obj, ...arr) // es6展开运算符
2. 箭头函数和普通函数的区别是什么,箭头函数可以用new生成实例吗?
1). 箭头函数语法上比普通函数更加简洁
function fn(x){
return function(y){
return x + y
}
}
var fn1 = x => y => x+ y
2). 箭头函数没有自己的this,他里面的this从属于函数所处的上下文(使用call、apply、bind等任何方式都无法改变this的指向)
var obj = { name: 'kkk'}
function fn(){
console.log(this)
}
fn.call(obj) //fn函数中的this指向obj
var fn2 = ()=>{
console.log(this)
}
fn2.call(obj) //fn2函数中的this指向window
fn2.bind(obj)() //fn2函数中的this指向window
document.body.onclick = () =>{
//this指向 window, 不是当前的body元素
}
document.body.onclick = function(){
//this指向body元素
[2,3,1].sort(function(a ,b){
//this => window, 回调函数中的this一般都是window
return a - b;
})
}
3). 箭头函数中没有arguments(类数组), 可以使用...arg获取参数集合(数组)
var fn = (...arg) => {
console.log(args)
}
fn(1,2,3) // [1,2,3]
4). 箭头函数不能new(因为箭头函数没有this,也没有prototype )
3.说一说new的执行过程
function Person(name, age){
this.name = name;
this.age = age;
}
const obj = new Person('frank', 20)
- 创建一个新对象
- 将构造函数的作用域赋给新对象(this也指向这个新对象)
- 执行构造函数中的代码(为这个新对象添加属性)
- 返回新对象
网友评论