call方法立即执行函数并绑定this,语法为func.call(thisArg, arg1, arg2...),第一个参数指定this指向,后续参数依次传入;null/undefined在非严格模式下指向全局对象,严格模式下保持原值;原始值被包装,对象则直接赋值给this。

call 方法能立即执行函数,并把 this 绑定到你传入的第一个参数上。
call 的基本用法
调用形式是 func.call(thisArg, arg1, arg2, ...)。第一个参数决定函数内部 this 指向谁,后面的参数依次传给函数。
- 如果传入 null 或 undefined,在非严格模式下 this 会指向全局对象(浏览器里是 window),严格模式下就是 null/undefined 本身
- 传入原始值(如字符串、数字、布尔值),会被自动包装成对应包装对象(如 "abc" → new String("abc"))
- 传入对象(包括数组、函数、普通对象)时,this 就直接指向该对象
一个直观的例子
假设有个函数打印 this.name:
function sayName() {
console.log(this.name);
}
单独调用 sayName(),this 指向全局对象,输出可能是 undefined 或 window.name;但用 call 就能精准控制:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- sayName.call({ name: 'Alice' }) → 输出 'Alice'
- sayName.call({ name: 'Bob' }, 'extra') → 仍输出 'Bob','extra' 是多余参数,函数没用上也不报错
和 apply、bind 的区别
三者都用于 this 绑定,但行为不同:
- call:立即执行,参数逐个列出
- apply:立即执行,第二个参数必须是数组或类数组
- bind:不执行,返回一个新函数,this 和部分参数被预先绑定
实际开发中常用场景
比如借用数组方法处理类数组(如 arguments、NodeList):
- Array.prototype.slice.call(arguments) 把 arguments 转成真数组
- Object.prototype.toString.call([]) 判断数据类型(比 instanceof 更可靠)
- 在事件回调或定时器中,想让某个方法保持特定 this,可提前用 call 包一层(不过 bind 或箭头函数更常用)

















