函数的方法: apply() 和call()

2021-02-20  本文已影响0人  肥羊猪

call( ),apply( ) 和 bind( )都是Function的方法,所有函数都有这三个非继承而来的方法。都是Function.prototype的方法。用途都是在特定的作用域中调用函数。

箭头函数中的this指向离自己最近非箭头函数作用域

bind后函数不会执行,而只是返回一个改变了上下文另一个函数,而call和apply直接执行函数。若无参数,apply与call基本没什么区别

都是用来改变函数的运行时的上下文对象(执行上下文)=>继承,或者说是改变函数内部this指向

apply()方法接收两个参数,一个是在其中运行函数的作用域,一个是参数数组,(这个参数数组可以是Array的实例,也可以是类数组arguments;)
call()方法和apply()的作用相同,区别仅在于接收的参数的方式不一样,使用call时候参数必须逐个列举出来传给函数。

function sum(num1, num2){
  return num1 + num2;
}
function callsum1(num1, num2){
     return sum.apply(this,arguments);  
     //return sum.apply(this, [sum1,sum2]);
}
function callsum2(num1, num2){
  return sum.call(this,num1, num2);
}
当参数明确的时候,建议使用call,
但传入的参数不明确的时候,或者是数组的时候,建议使用apply。

扩充函数赖以运行的作用域,对象不需要和方法有任何耦合的关系。
var animal = {
    words:'......',
    speak:function(say){
        console.log(say + ' ' + this.words);
    }
}
var dog ={
  words: 'wang' 
}
//dog没有say这个方法,但是可以通过call来调用aniaml的say方法。
animal.speak.call(dog, 'speak');
 //dog就是call()这个方法的上下文,this指向了dog这个对象。

1.非严格条件下,call和apply的第一个参数为null、undefined、空,函数内的this指向window(浏览器 ) 或global
严格模式下,函数内的this nullnullundefined和空undefined
bind返回的是对应的函数不会立即调用,而call、apply都是立即调用的。
this指向还可以通过new操作符来改变
通常情况下this指向调用他的最近一级对象 普通函数里面指向Window

Array.prototype.slice.call ( arguments);
[].prototype.slice.apply(arguments);
[].shift.call(arguments);//保存需要绑定的this上下文,就是第一个参数
Object.prototype.toString.call(obj) === '[object Array]' ;

new fn()改变fn内部this指向可等同于如下:

a = 2;
let obj = {
    a: 1,
    func: function () {
        var self = this;
        console.log(this.a);//1
        console.log(self.a);//1
        (function () {
            console.log(this.a);//2
            console.log(self.a);//1 闭包作用域 最近的调用者obj
        })();
    }
};
obj.func();//1,1,2,1;
上一篇 下一篇

猜你喜欢

热点阅读