深入理解call,以及与apply、bind的区别

1、call

修改函数运行时this的指向

// 代码段一
var obj = {name: 'psg'};
function fn(num1, num2) {
    console.log(num1+num2);
    console.log(this) 
}
// 1、call里面,第一个参数就会说要变成this的对象
fn(100, 200); //this指向window, num1=100, num2=200
fn.call(100, 200); //this指向100, num1=200, num2=undefined
fn.call(obj, 100, 200); //this指向obj,  num1=100, num2=200
 
// 2、在非严格模式下,call里面,第一个参数如果是空、null、undefined,会导致this指向window
fn.call(); //this指向window
 
// 3、在严格模式下,call里面,传谁this就是谁,不传,this就是undefined
fn.call(); //this指向undefined
fn.call(null); //this指向null
fn.call(undefined); //this指向undefined

2、apply

  • apply和call方法的作用是一模一样的,都是用来改变方法中this关键字并且将方法执行,而且在严格模式、非严格模式下对于第一个参数是null / undefined这种情况的规律也是一样的。

  • 跟call唯一的的区别就是语法的区别:

//call传递参数是用逗号分隔,一个一个传进去
fn.call(obj, arg1,arg2,arg3.....)
//apply传递参数是用一个数组传的
fn.apply(obj, [arg1,arg2,arg3....])

3、bind

与apply、call类似,都是用来改变this指向,
但是bind它是把function中的this改变成我们想要的结果,并且把对象的参数也准备好了(它并不会执行相应函数,会返回一个新的修改this指向,以及传递好了相应参数的方法),以后要用到了,直接执行即可。

var obj = {name: 'psg'};
function fn(num1, num2) {
    console.log(num1+num2);
    console.log(this);
}
fn.call(obj, 100, 200);
fn.bind(obj, 100, 200);  
// 只是改变了fn中的this为obj,并且给fn传递了两个参数值,但是此时并没有去执行fn这个函数。
// 它会有一个返回值,这个返回值myFn就是我们把fn的this改变后的那个结果!!!
 
//那么,如何让fn这个函数执行呢,下面的写法就行解决方法
var myFn = fn.bind(obj, 100, 200);
myFn();

参考链接: https://www.cnblogs.com/pengshengguang/p/11184378.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章