bind/apply/call区别、var/const/let区别

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不会被初始化

变量提升: 在代码执行之前,将变量声明和函数声明提升到当前作用域的顶部。
注意:只有声明会被提升,赋值操作不会被提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值