JavaScript 的apply,call和bind
-
每個函數(shù)都包含兩個非繼承而來的方法:apply(), call().
這個兩個方法的用途都是在特定的作用域中調用函數(shù)實際上等于設置函數(shù)體內的this對象的值。
-
apply() 方法接受兩個參數(shù)
- -個是在其中運行函數(shù)的作用域,也就是this
- 另一個是參數(shù)數(shù)組。這個數(shù)組可以是Array的實例,也可以是arguments對象
-
call() 方法與 apply()方法的作用相同,區(qū)別僅在于接受參數(shù)的方法不同
- call() 方法第一個參數(shù)是一樣是this,變化的是其余參數(shù)都直接傳遞給函數(shù)。在使用call()方法時,傳遞給函數(shù)的參數(shù)必須逐個列舉出來
-
apply() 和 call() 方法的真正用處是可以拓展函數(shù)賴以運行的作用域,而擴充作用域的最大好處,就是對象不需要與方法有任何耦合關系
window.color = 'red'; var o = { color: 'blue' } function saycolor() { console.log(this.color); } saycolor() // red sayColor.call(this) //red, 因為在全局下的this默認是window || global saycolor.call(window) //red saycolor.call(o) //clue
-
ES5中還定義了一個方法: bind().
- bind() 方法會創(chuàng)建一個函數(shù)的實例,這個函數(shù)實例的this值會被綁定到傳給 bind() 函數(shù)的值
window.color = 'red'; var o = { color: 'blue' } function saycolor() { console.log(this.color); } var objectsaycolor = saycolor.bind(this) objectsaycolor(); //blue