call方法可显式指定函数内this指向并立即执行,语法为func.call(thisArg, arg1, arg2...),适用于借用方法、临时切换上下文等场景,优先级高于隐式和默认绑定但低于new绑定,且对箭头函数无效。

JavaScript中call方法可以显式指定函数内部this的指向,并且立即执行该函数,是实现显式绑定最直接的方式。
call的基本语法和作用
call是函数对象的内置方法,所有函数都可调用。它接收第一个参数作为函数运行时this的值,后续参数依次传入原函数。
语法:func.call(thisArg, arg1, arg2, ...)
关键点:
- thisArg会被强制绑定为函数内this的值(null/undefined在非严格模式下会转为全局对象)
- 函数立刻调用,不返回新函数,只返回原函数的执行结果
- 若thisArg不是对象,会被自动包装(如42 → new Number(42))
常见使用场景
借用其他对象的方法
比如让数组方法处理类数组对象:
-
Array.prototype.slice.call(arguments)把arguments转成真数组 -
Object.prototype.toString.call([])安全获取类型字符串(避免实例重写toString)
临时切换上下文执行逻辑
例如在事件回调或定时器中复用某个对象的方法:
-
obj.method.call(otherObj, 'a', 'b')让obj.method以otherObj为this运行一次 - 避免手动保存
this(如const self = this),适合一次性调用
与apply、bind的区别要点
call和apply都立即执行,区别仅在参数传递形式:
- call:参数逐个列出
- apply:参数以数组形式传入
bind则不同:
- 不执行函数,而是返回一个this被绑定后的新函数
- 新函数可延迟调用,支持预设部分参数(柯里化)
- call更轻量,适合“执行一次、绑定一次”的明确需求
注意this绑定的优先级
call属于显式绑定,优先级高于隐式绑定(如obj.fn())和默认绑定(如独立调用fn()),但低于new绑定(构造函数调用)。这意味着:
- 即使函数是通过对象属性调用的,
call仍能覆盖其this - 箭头函数没有自己的
this,call无法改变其this指向(它沿用外层作用域的this)
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











