1. bind、apply、call绑定this的时候的相同点与不同点:
相同点:都可以改变this指向
直接用obj.say()打印出的是张三,这里的this指向的是它的调用者obj
放在setTimeout打印出‘codereasy’,这里的this指向的是window对象,因为在这里say()是用作回调函数来执行的,传的只是这个函数的引用,没有保留这个函数所属的对象
函数里面的this取决于调用时的执行上下文,在setTimeout里没有指定执行上下文,就默认在全局的执行环境中,指向的就是window
修改this里的指向-apply
setTimeout(function(){
obj.say.apply(obj);
},10)//输出张三
如果函数有多个参数,可以放在一个数组中作为第二个参数传递给apply
obj={
name:'张三',
say:function(p1,p2){
console.log(p1+p1);
}
};
setTimeout(function(){
obj.say.apply(obj,[p1,p2]);
},10)//输出张三
call()
和apply的唯一区别是传入的参数不不用放在一个数组中
setTimeout(function(){
obj.say.call(obj,p1,p2);
},10)//输出张三
bind()
1.与前两种最大区别是bind返回值是一个新的函数,并不会直接执行这个函数
let newFun=obj.say.bind(obj,p1,p2);
newFun();
2.并不需要一次传参
let newFun=obj.say.bind(obj);//绑定this
newFun(p1,p2);
2. var、const、let区别
1. 作用域:
var作用域是全局作用域
或函数作用域
const、let是块级作用域{}
2.更新和声明
var可以更新和重新声明;
let可以更新但不能重新声明;
const既不能更新也不能重新声明。
3. 变量提升
在变量提升方面,都被提升到了作用域的顶部。但是var会被初始化为undefined,let和const不会被初始化
变量提升: 在代码执行之前,将变量声明和函数声明提升到当前作用域的顶部。
注意:只有声明会被提升,赋值操作不会被提升。