javascript中bind、call、apply有什么区别?

方法执行时机参数传递方式返回值

使用建议

demo

call

立即执行函数

接收参数列表,第一个参数是 this 指向,后面的参数依次作为函数的实参传入

语法:fn.call(thisArg, arg1, arg2, ...)

函数执行后的返回值

‌需要立即执行 + 参数明确‌ → 用 call

const person = {
    name: '张三'
};

function greet(age, city) {
    console.log(`我叫${this.name},今年${age}岁,住在${city}`);
}

// call 会立即执行,参数一个个列出来
greet.call(person, 25, '北京');
// 输出:我叫张三,今年25岁,住在北京

apply

立即执行函数

接收参数数组,第一个参数是 this 指向,第二个参数是一个数组或类数组,作为函数的实参传入

语法:fn.apply(thisArg, [...argsArray])

函数执行后的返回值

需要立即执行 + 参数在数组中‌ → 用 apply

const person = {
    name: '李四'
};

function greet(age, city) {
    console.log(`我叫${this.name},今年${age}岁,住在${city}`);
}

// apply 会立即执行,参数以数组形式传入
greet.apply(person, [30, '上海']);
// 输出:我叫李四,今年30岁,住在上海

bind

不立即执行

传参方式和 call 一样(列表形式),但可以在绑定的时候传一部分参数,也可以在调用返回的新函数时再传剩下的参数(函数柯里化)

绑定了 this 的新函数

需要延迟执行、绑定上下文(如事件回调)或预设参数‌ → 用 bind

const person = {
    name: '王五'
};

function greet(age, city) {
    console.log(`我叫${this.name},今年${age}岁,住在${city}`);
}

// bind 不会立即执行,而是返回一个新函数
const boundGreet = greet.bind(person, 28); 

// 等到需要的时候再调用,并传入剩余参数
boundGreet('广州');
// 输出:我叫王五,今年28岁,住在广州

// 也可以不预先传参,调用时再全传
const boundGreet2 = greet.bind(person);
boundGreet2(35, '深圳');
// 输出:我叫王五,今年35岁,住在深圳

 

posted @ 2026-03-04 16:15  口木秋子  阅读(3)  评论(0)    收藏  举报