call()跟apply() 改变this指向

本文深入探讨了JavaScript中call和apply的区别与应用场景,通过实例展示了如何利用这两个方法改变函数执行时this的指向,以及在实际开发中的应用,如组装车辆部件。
  1. call跟applay

call();跟执行函数()是一样的效果 test.call()相当于test()

call()跟apply()都是改变this的指向

两者区别 传参列表不同

Fun.call(新this指向,参数1,参数2,参数3,……)

Fun.apply(新this指向,用对象形式传参)


// 场景:当生产车间,需要用到别人的零件,
// 可以用call或apply将别人的函数拿过来为自己所用

// 如这是车座部件
function Sit(h,w){
	this.carHeight = h;
	this.carWidth = w;
}
// 车颜色
function Color(c){
	this.carColor = c;
}
// 车轮
function Wheel(size){
	this.size = size;
}
// 这是车间
function Car(name,h,w,c,size){
	// 自己的东西
	this.name = name;
	// 直接拿别人的部件来用
	Sit.call(this,h,w);//这里的this,就将原本Sit的this指向改为了Car本身
	Wheel.call(this,size);
	Color.call(this,c);
}

var car = new Car('我的车',100,100,'绿色','超大');

// 使用apply
function Car2(name,h,w,c,size){
	// 自己的东西
	this.name = name;
	
	// 直接拿别人的部件来用  apply传参必须是对象的形式 [] {}等
	Sit.apply(this,[h,w]);//这里的this,就将原本Sit的this指向改为了Car2本身
	Wheel.apply(this,[size]);
	Color.apply(this,[c]);

}
var car1 = new Car2('我的车',100,100,'绿色','超大');

 

<think>好的,我现在需要回答用户关于JavaScript中callapply和bind方法如何改变this指向的问题,以及它们的区别。首先,我得回顾一下这三个方法的基本用法和区别,确保自己理解正确。 根据用户提供的引用内容,callapply和bind都是用来改变函数执行时的this指向的。它们的核心区别在于传参方式和执行时机。callapply会立即执行函数,而bind会返回一个新函数,需要再次调用才会执行。另外,call接受参数列表,apply接受数组形式的参数。 接下来,我需要整理这些信息,结构清晰地呈现给用户。可能需要分步骤说明每个方法的使用方式,然后比较它们的区别,最后给出应用场景的例子。 需要注意的是,用户要求回答使用中文,并且引用内容要自然地添加引用标识。我需要确保每个引用正确对应到用户提供的参考资料,例如在提到call方法时引用[^1]或[^3]。 另外,用户示例中的快速排序部分使用了代码块,可能这里也需要在说明方法时提供代码示例,比如展示如何使用callapply和bind,并说明输出结果。例如,call的示例代码可以展示如何改变函数的this指向并传递参数,而bind的例子则显示如何创建新函数稍后调用。 还要检查是否有遗漏的区别点,比如bind返回函数后是否允许后续传参,这点可能需要提到,但用户提供的引用中没有明确说明,可能需要根据已有知识补充,但需要确认引用内容是否覆盖这一点。根据引用[4],bind不会立即调用函数,返回的新函数需要手动调用,而callapply会立即执行。 最后,生成相关问题,需要根据这三个方法的应用和区别提出相关问题,比如它们的执行时机、传参方式差异、应用场景等。</think>### JavaScript中callapply、bind方法详解 **callapply、bind** 是JavaScript中用于显式改变函数内部`this`指向的核心方法。以下是具体用法及区别: --- #### 一、基本语法与使用 1. **call方法** **语法**:`函数.call(thisArg, arg1, arg2, ...)` - 立即执行函数,并将`this`指向`thisArg`,参数逐个传递。 ```javascript function greet(a, b) { console.log(this.name, a + b); } const obj = { name: "Alice" }; greet.call(obj, 1, 2); // 输出:Alice 3 [^1][^3] ``` 2. **apply方法** **语法**:`函数.apply(thisArg, [argsArray])` - 立即执行函数,`this`指向`thisArg`,参数以数组形式传递。 ```javascript greet.apply(obj, [3, 4]); // 输出:Alice 7 [^1][^4] ``` 3. **bind方法** **语法**:`函数.bind(thisArg, arg1, arg2, ...)` - 返回一个新函数,绑定`this`指向`thisArg`,参数可预先设置或后续补充。 ```javascript const boundGreet = greet.bind(obj, 5); boundGreet(6); // 输出:Alice 11 [^2] ``` --- #### 二、核心区别 | 特性 | call | apply | bind | |-----------|---------------------|---------------------|---------------------| | **执行时机** | 立即执行 | 立即执行 | 返回新函数,需手动调用 | | **参数形式** | 逐个传递(逗号分隔) | 数组传递 | 可预先设置或后续补充 | | **应用场景** | 明确参数数量时使用 | 参数数量不确定或需传递数组时使用 | 需延迟执行或绑定上下文时使用 | --- #### 三、典型应用场景 1. **call** - **继承**:在构造函数中调用父类方法。 ```javascript function Father(name) { this.name = name; } function Son(name) { Father.call(this, name); // 继承Father属性 } ``` - **借用方法**:如借用数组方法处理类数组对象。 2. **apply** - **数组合并**:如使用`Math.max`计算数组最大值。 ```javascript Math.max.apply(null, [1, 2, 3]); // 输出3 [^1] ``` 3. **bind** - **事件回调**:绑定事件处理函数的`this`指向组件实例。 ```javascript button.addEventListener("click", this.handleClick.bind(this)); ``` - **函数柯里化**:预先设置部分参数。 --- #### 四、注意事项 - **性能**:频繁使用`bind`会生成新函数,可能影响内存。 - **箭头函数**:箭头函数的`this`无法通过这些方法改变
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值