call、apply、bind函数在改变函数运行时this的指向问题的区别

5 篇文章 0 订阅

首先,call、apply、bind都可以改变函数运行时this的指向问题

<script>

var value = "王1";
var obj = {
	value: "开2",
	friend: {
		value: "贵3",
		sayHi: function() {
			console.log(this.value);
		}
	}
};

obj.friend.sayHi(); //打印贵3
obj.sayHi = obj.friend.sayHi;
//谁调用this就属于谁
obj.sayHi(); //打印开2
//window
var sayHi = obj.friend.sayHi;
sayHi(); //打印王1
console.dir(sayHi); //dir查看结构
//call()参数1是你要修改的this
var obj2 = {
	value: "星星";
};
sayHi.call(obj2);
sayHi.apply(obj2);
function sayHello(a, b) {
	console.log(this, "jom", a, b);
}
sayHello(10, 20);
//call:从参数2开始,就是对应原函数的参数
sayHello.call(obj2, 96, 72);
//apply:参数2是个数组,数组位置对应原函数参数
sayHello.apply(obj2, [66, 888]);


//数组元素对应的形参,借助apply
var numbers = [9, 1, 20, 30, 100];
var min = Math.min.apply(Math, numbers);
console.log(min);
//es6的解构赋值
var min = Math.min(...numbers);
console.log(min);
//bind函数
//bind 方法不会立即执行,而是返回一个改变了上下文 this 后的函数
var fn = sayHello.bind(obj, 111, 222);
fn();
setTimeout(function() {
	console.log(this); //window
}.bind(obj2), 2000);

</script>

通过上面的例子可以看出call、apply和bind函数存在的区别:

bind方法不会立即执行,返回一个改变了上下文的this后的函数, 便于稍后调用; apply, call则是立即执行。

 除此外, 在 ES6 的箭头函数下, call 和 apply 将失效, 对于箭头函数来说:

// 箭头函数体里面的 this 对象, 是定义时所在的对象, 

// 箭头函数不能用作构造函数,也就是说不能使用 new 命令

// 箭头函数不可以使用 arguments 对象

所学有限,总结不到位欢迎补充!

  • 15
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尔嵘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值