前端面试题:bind,call和apply的区别

一、文字描述:

1、相同点:

 三个函数都会改变this的指向(调用这三个函数的函数内部的this)

2、不同点:

 1)、bind会产生新的函数,(把对象和函数绑定死后,产生新的函数)

 2)、call和apply不会产生新的函数,只是在调用时,绑定一下而已。

 3)、call和apply的区别,第一个参数都是要绑定的this,apply第二个参数是数组(是函数的所有参数),call把apply的第二个参数单列出来。

二、示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style type="text/css">
       
    </style>
</head>
<body>
    <!-- <input type="button" value="测试" onclick="testf()"  /> -->
</body>
</html>

<script type="text/javascript">
//demo07面试题:请问bind,call,apply的区别
//1、相同点:
//   三个函数都会改变this的指向(调用这三个函数的函数内部的this)

//2、不同点:
//  1)、bind会产生新的函数,(把对象和函数绑定死后,产生新的函数)
//  2)、call和apply不会产生新的函数,只是在调用时,绑定一下而已。
//  3)、call和apply的区别,第一个参数都是要绑定的this,apply第二个参数是数组(是函数的所有参数),call把apply的第二个参数单列出来。

//示例代码:
var p1 = {
	name:"隔壁老王",
}

function eat(str,drinkstr) {
	console.log(this.name+"在吃"+str+",同时在喝"+drinkstr);
}

//1、bind:
let f1 = eat.bind(p1);//f1是个函数。即,用bind把eat函数和p1对象绑死,产生新的函数叫作f1
f1("油条","豆浆");//调用f1,就相当于 p1.eat();,内部的this就是p1,永远都是p1,不会是window

//2、call:
eat.call(p1,"油泼面","面汤");//不会产生新的函数,只是临时把eat函数和p1对象绑定一下。

//3、apply:(与bind的意思一样,只是第二个参数是数组,是原函数eat的参数)
eat.apply(p1,["油泼面","面汤"]);//不会产生新的函数,只是临时把eat函数和p1对象绑定一下。

</script>
发布了219 篇原创文章 · 获赞 347 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/jiang7701037/article/details/99975245