javascript函数的调用模式有哪几种( 三 )

javascript函数的调用模式有哪几种

一、从语法当中了解这三个函数调用
(1)call();
语法:函数名.call(期望函数内部this指向谁, 参数1,参数2....); 【javascript函数的调用模式有哪几种】 javascript函数的调用模式有哪几种

其中14行的普通调用的话用getSum()函数,this指向window; 第15行用call()的方式调用getSum()函数, 第1个参数传入”期望getSum函数中的this指向”,后面的参数依次传入getSum函数的参数即可。此时getSum函数一样被执行,不同的是getSum函数中的this就指向了obj对象,同时也把100,200分别赋值给形参a和b. 执行结果如下:javascript函数的调用模式有哪几种

(2)apply();
语法:函数名.apply(this的新指向 , 数组或者伪数组);
注意apply()和call()的区别在于apply()只有2个参数,第一个参数是this的新指向,第二个参数是数组或者伪数组,调用的时候会把第二个参数(数组或伪数组)的元素依次的赋值给被调用函数的形参。
javascript函数的调用模式有哪几种

第24行普通方式调用getSum()函数,this指向window; 第25行用apply()的方式调用getSum()函数,此时getSum()函数中的this就指向了obj对象,同时把数组的元素100,200,300依次赋值给getSum()函数的形参a,b,c ; 执行结果如下:javascript函数的调用模式有哪几种

(3)bind();
语法:函数名.bind( this的新指向 ,可以写参数也可以不写参数 );
需要注意的是函数用bind()的方式调用并不会执行该函数,而是会返回一个函数体一模一样但是修改了this指向后的函数。
javascript函数的调用模式有哪几种

第34行普通方式调用getSum()函数,this指向window; 第36行虽然用bind()的方式调用getSum()函数,但是此时并不会执行getSum()函数,而是会返回一个和getSum()函数的函数体一模一样但是this已经修改成obj对象的函数了,这个函数被fn变量接收。 执行结果如下:(只有一次函数体被执行,就是34行的调用)。javascript函数的调用模式有哪几种

此时如果调用fn()函数,就相当于执行getSum()函数,但是getSum函数中的this已经被修改成了obj对象,调用代码和执行结果如下:
javascript函数的调用模式有哪几种

执行结果一样,如下:
javascript函数的调用模式有哪几种

javascript函数的调用模式有哪几种

二、上下文的调用模式需要注意的细节
1.大家都知道javascript中的函数(普通函数、构造函数)本质上是一个对象,是由Function()构造函数实例化出来的对象,而call、apply、bind这三个方法都是定义在Function.prototype原型中的,那么意味着javascript中的所有函数都可以点出这三个方法来。


推荐阅读