10、call、apply、bind的区别

call、apply、bind的区别
1、call和apply的区别

共同点:

三者共同点:都是改变this指向的。

// 不同的: call()/apply()----->bind()

// call() vs apply() 不同的:在于第二个参数,call第二个参数是一个一个的数据,apply第二个参数是数组。
// 共同点:将this指向第一个参数。

// call()、apply() vs bind: bind只修改this指向,需要加()才能执行这个方法 不会直接的执行
和apply

 例:function fu(){
    
    
 
 console.log(argumets)//首先打印一下 伪数组
 
 }
 
fu(2,3,4,5,6)  //实参

需求:在伪数组中添加 一个数字

casll方法:借用数组的方法来操作数组

// 只添加一个参数的 时候 
Array.prototype.push.call(arguments,100)
// 借用 Array 数组 的原型上的数组方法 
push(改变后的this的指向,‘需要操作的参数’) 

//多个参数 会直接放进数组里

//添加多个数字的时候 
Array.prototype.push.call(arguments,[100,200,300])
得到的结果会是整个数组添加进去了 而不是 单个数字添加的效果

//数组的  哎 这
apply方法:借用数组的方法来操作数组

//追加多个参数

 例:function fu(){
    
    
 console.log(argumets)//首先打印一下 拿到伪数组
 }
 
//执行函数  fu(2,3,4,5,6)  //并且传入实参
//追加多个参数
Array.prototype.push().apply(argumets,[100,200,300]){
    
    
}
//会展开的添加,而不是直接添加数组 

7、call & apply

每个函数都包含两个非继承而来的方法:apply()和 call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。

apply()

apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。
其中,第二个参数可以是 Array的实例,也可以是arguments 对象。

function sum(num1, num2){
    
     
 return num1 + num2; 
} 
function callSum1(num1, num2){
    
     
 return sum.apply(this, arguments); // 传入 arguments 对象
} 
function callSum2(num1, num2){
    
     
 return sum.apply(this, [num1, num2]); // 传入数组
} 
console.log(callSum1(10,10)); //20
console.log(callSum2(10,10)); //20

在严格模式下,未指定环境对象而调用函数,则 this 值不会转型为 window。除非明确把函数添加到某个对象或者调用 apply()或 call(),否则 this 值将是undefined。

call()

call()方法与 apply()方法的作用相同,它们的唯一区别在于接收参数的方式不同。在使用call()方法时,传递给函数的参数必须逐个列举出来。

function sum(num1, num2){
    
     
 return num1 + num2; 
}
function callSum(num1, num2){
    
     
 return sum.call(this, num1, num2); 
} 
console.log(callSum(10,10)); //20

call()方法与 apply()方法返回的结果是完全相同的,至于是使用 apply()还是 call(),完全取决于你采取哪种给函数传递参数的方式最方便。

参数数量/顺序确定就用call,参数数量/顺序不确定的话就用apply。
考虑可读性:参数数量不多就用call,参数数量比较多的话,把参数整合成数组,使用apply。

8、bind()

bind()方法会创建一个函数的实例,其 this 值会被绑定到传给 bind()函数的值。意思就是 bind() 会返回一个新函数。例如:

window.color = "red"; 
var o = {
    
     color: "blue" }; 
function sayColor(){
    
     
 alert(this.color); 
} 
var objectSayColor = sayColor.bind(o); 
objectSayColor(); //blue

注意:call/apply与bind的区别

执行:
call/apply改变了函数的this上下文后马上执行该函数
bind则是返回改变了上下文后的函数,不执行该函数

function add (a, b) {
    
    
    return a + b;
}
function sub (a, b) {
    
    
    return a - b;
}
add.bind(sub, 5, 3); // 这时,并不会返回 8
add.bind(sub, 5, 3)(); // 调用后,返回 8

返回值:

call/apply 返回fun的执行结果
bind返回fun的拷贝,并指定了fun的this指向,保存了fun的参数。
call/apply/bind的核心理念

从上面几个简单的例子可以看出call/apply/bind是在向其他对象借用方法,这也符合我们的正常思维

A对象有个方法,B对象因为某种原因也需要用到同样的方法,这时候就可以让B借用 A 对象的方法啦,既达到了目的,又节省了内存。

这就是call/apply/bind的核心理念:借。

おすすめ

転載: blog.csdn.net/m0_57349005/article/details/117324009