javascript 之 apply()、call() 探索

ECMAScript 规范给所有函数都定义了apply 和 call 方法,并且是非继承;
用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。借用别的对象的方法;改变函数调用对象

apply()

apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。
apply的主要用途是改变函数的作用域,在特定的作用域中调用函数,实际上等于设置函数体内的this对象的值。

apply()基本语法:

Function.prototype.apply(thisArg[, argsArray])
参数说明:

参数名 参数说明
thisArg 在Function 函数运行时指定到this值或者叫对象,需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
argsArray 一个数组或者类数组对象、arguments对象,非必传,其中的数组元素将作为单独的参数传给 Function函数。如果该参数的值为null 或 undefined,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。

一句话总结:
apply() 函数用于调用当前函数Function,并且同时使用指定对象 thisArg作为本次函数执行时函数内部this指针的引用
绕口吧,这是我目前认为最精准的定义。
定义复杂切抽象来点实际的:

函数中使用

定义一个函数,两个数字相加:

let {
   log} = console; //es6 语法 解构
function sum(x,y){
   
    return x+y;
}
log(sum.apply(null,[1,2])); // 3
log(sum.apply(undefined,[3,2])); // 5
log(sum.apply(this,[4,2]));  //6

依据定义每个函数都有apply方法,我们直接在全局模式下运行,而且是非严格模式 这个时候调用apply方法,this,null,undefined都是指向window对象。

因此我们在执行apply方法的时候具体this指向哪里需要看运行时候的对象环境,全局就是widow对象,

上述例子 说明是吧sum方法放到 window对象执行,等同于直接调用sum(1,2);

有时候我们使用 call 或者 apply 的目的不在于指定 this 指向,而是另有用途,比如借用其 他对象的方法。那么我们可以传入 null 来代替某个具体的对象

Math.max.apply( null, [ 1, 2, 5, 3, 4 ] ) // 输出:5

在函数里面调用另外一个函数的apply方法会发生什么呢?


                
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值