javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > js call() apply() bind()用法

JavaScript中call()、apply()和bind()方法的用法与区别及适用场景

作者:Bling_Bling_1

在JavaScript中,call()、apply()和bind()是三个非常重要的函数方法,它们都用于改变函数执行时的this指向,但在使用方式和执行时机上有显著区别,下面给大家介绍JavaScript中call()、apply()和bind()方法的详细用法与区别,感兴趣的朋友一起看看吧

JavaScript中call()、apply()和bind()方法的详细用法与区别

在JavaScript中,call()apply()bind()是三个非常重要的函数方法,它们都用于改变函数执行时的this指向,但在使用方式和执行时机上有显著区别。下面将详细介绍这三个方法的用法、区别以及适用场景。

一、基本概念与共同点

这三个方法都是Function.prototype上的方法,因此所有函数都可以调用它们。它们的主要共同点是:

  1. 函数调用:都可以调用函数,控制函数的调用方式
  2. 改变this指向:都可以指定函数执行时的this
  3. 参数传递:都可以在调用时传递参数给原函数

二、call()方法详解

call()方法调用一个函数,并允许你指定函数执行时的this值,以及逐个传递参数。

1. 基本语法

fn.call(thisArg, arg1, arg2, ...)

2. 特点

3. 使用示例

//函数调用,改变this指向
function fn(){
    console.log(this.name)
}
let cat = { 
    name:'喵喵'
}
let dog = {
    name:'旺财',
    sayName(){
    	console.log('我是' + this.name)
    },
    eat(food1,food2){
        console.log('我喜欢吃' + food1 + '和'+ food2)
    }
}
fn.call()        // undefined
fn.call(cat)     // 喵喵(this指向改变,将fn与cat建立起一个联系)
dog.sayName()            //我是旺财
dog.sayName.call(cat)    //我是喵喵
dog.eat('骨头','肉')     //我喜欢吃骨头和肉 
dog.eat.call(cat)        //undefinded (未传入参数)
dog.eat.call(cat,'鱼','肉') //我喜欢吃鱼和肉 

4. 应用场景

三、apply()方法详解

apply()方法与call()非常相似,唯一区别在于参数传递方式,apply()是数组传参。

1. 基本语法

func.apply(thisArg, [argsArray]) //数组传递参数

2. 特点

3. 使用示例

dog.eat.apply(cat,['鱼','肉']) //我喜欢吃鱼和肉 

4. 应用场景

四、bind()方法详解

bind()方法创建一个新的函数,在调用时具有指定的this值和预设参数。

传参方式与call一样,但bind不是调用函数,而是返回函数的返回值。

1. 基本语法

func.bind(thisArg, arg1, arg2, ...)

2. 特点

3. 使用示例

let fun = dog.eat.bind(cat,'鱼','肉')
fun() //输出 我喜欢吃鱼和肉 

4. 应用场景

五、三者的核心区别

特性call()apply()bind()
执行时机立即执行立即执行返回新函数,不立即执行
参数传递参数列表(arg1, arg2,…)参数数组([arg1, arg2,…])参数列表或部分预设
this绑定临时绑定,仅本次调用有效临时绑定,仅本次调用有效永久绑定,新函数始终有效
返回值函数执行结果函数执行结果绑定后的新函数

六、实际应用场景对比

七、高级用法与注意事项

  1. 严格模式下的this:在严格模式下,如果call()apply()的第一个参数为nullundefinedthis将指向undefined而非全局对象
  2. bind()的特殊行为:•使用new操作符调用绑定函数时,预设的this值会被忽略•绑定函数的name属性会带有"bound"前缀
  3. 参数合并bind()可以预设部分参数,调用绑定函数时传递的参数会接在预设参数后面
  4. 性能优化:在频繁调用的场景中,使用bind()预先绑定比每次调用call()apply()更高效

八、总结

call()apply()bind()是JavaScript中控制函数执行上下文的强大工具。理解它们的区别和适用场景对于编写灵活、可维护的代码至关重要:

  1. 需要立即执行且参数独立时用call()
  2. 需要立即执行且参数在数组中时用apply()
  3. 需要延迟执行或保持上下文时用bind()

掌握这三个方法的使用技巧,可以让你更好地控制JavaScript中的this指向,编写出更加优雅和高效的代码。

到此这篇关于JavaScript中call()、apply()和bind()方法的用法与区别及适用场景的文章就介绍到这了,更多相关js call() apply() bind()用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文