apply call bind 的區別
- apply,call的存在是為了改變函數體內部this的指向,改變作用域的.來舉個栗子:
function People(){}
People.prototype = {
age=18,
sayAge = function(){
return this.age
}
let me = new People()
me.sayAge() //18
let you = {age: 22}
me.sayAge.apply(you) // 22
me.sayAge.call(you) // 22
可以看出來apply,call的作用是一樣的,都在動態的改變this的指向,但是它們接受參數的方式不太一樣
apply(this, [arg1, arg2,arg3])
apply以數組的形式接受參數
call(this,arg1,arg2,arg3)
call參數按順序傳遞進去
- bind MDN給出的解釋是: bind()方法創建一個新的函數,當被調用時,將其this關鍵字設置為提供的值,在調用新函數時,在任何提供之前提供一個給定的參數序列.
fun.bind(thisArg[, arg1[, arg2[, ...]]])
thisArg
當綁定函數被調用時,該參數會作為原函數運行時的this指向.當使用new操作符調用綁定函數時,改參數無效.
arg1,arg2...
當綁定函數被調用時,將這些參數置于實參之前傳遞給被綁定的方法 - apply, call 是立即執行函數,bind是你改變上下文環境之后并非立即執行的,而是回調的時候執行.
- 敲黑板,總結一下
- apply 、 call 、bind 三者都是用來改變函數的this對象的指向的
- apply 、 call 、bind 三者第一個參數都是this要指向的對象,也就是想指定的上下
文 - apply 、 call 、bind 三者都可以利用后續參數傳參
- bind 是返回對應函數,便于稍后調用;apply 、call 則是立即調用
- 今天小師傅出了一道課下練習題,求數組的最大最小值,那就也放出來吧
- es6 的解決辦法
Math.max(...[1,2,3]) // 3
使用...
都數組解構 -
Math.max.apply(null, [1,2,3]) // 3
就是這么神奇
Math.max([1,2,3]) // NaN