apply 和 call
apply
和call
可以重新定义函数的执行环境,也就是this
的指向。- 区别是
apply
接受的是数组参数,call
接受的是连续参数。 - 调用后后会立即执行函数。
通过一个操作DOM的例子来理解。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="box" style="width: 100%; height: 600px; background: #eee;"></div>
<script>
function changeStyle(attr, value) {
this.style[attr] = value
}
let box = document.getElementById('box')
box.addEventListener('click', function(e) {
window.changeStyle.apply(box, ['height', '200px'])
})
</script>
</body>
</html>
另一个例子:
let a = { 0: 1, 1: 2, length: 2 }
console.log(Array.prototype.slice.call(a, 1, 2)) // [2]
对象 a 类似 Array,但不具备 Array 的 slice
方法。使用 call
绑定就可以调用 slice
方法。
bind
与call和apply不同的是,bind绑定后不会立即执行。
func.bind(obj, arg1, arg2, ...)