三者區(qū)別
1.bind 是返回對應函數(shù)懂衩,便于稍后調(diào)用腕铸;apply 办悟、call 則是立即調(diào)用 。
2.phcall 和 apply 改變函數(shù)體內(nèi)部 this 的指向
apply牙甫、call
1.JavaScript 的一大特點是掷酗,函數(shù)存在「定義時上下文」和「運行時上下文」以及「上下文是可以改變的」這樣的概念。
function fruits() {}
fruits.prototype = {
color: "red",
say: function() {
console.log("My color is " + this.color);
}
}
var apple = new fruits;
apple.say(); //My color is red
banana = {
color: "yellow"
}
apple.say.call(banana); //My color is yellow
apple.say.apply(banana); //My color is yellow
總結(jié):call 和 apply 是為了動態(tài)改變 this 而出現(xiàn)的窟哺,當一個 object 沒有某個方法(本栗子中banana沒有say方法)泻轰,但是其他的有(本栗子中apple有say方法),我們可以借助call或apply用其它對象的方法來操作且轨。
apply浮声、call 區(qū)別
ar func = function(arg1, arg2) {
};
func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])
總結(jié): this 是你想指定的上下文,他可以是任何一個 JavaScript 對象(JavaScript 中一切皆對象)旋奢,call 需要把參數(shù)按順序傳遞進去泳挥,而 apply 則是把參數(shù)放在數(shù)組里。
舉例說明
獲取數(shù)組中的最大值和最小值
var numbers = [5, 458 , 120 , -215 ];
var maxInNumbers = Math.max.apply(Math, numbers), //458
maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458
number本身沒有 max 方法至朗,但是 Math 有羡洁,我們就可以借助 call 或者 apply 使用其方法。
bind
在討論bind()方法之前我們先來看一道題目:
var altwrite = document.write;
altwrite("hello");
結(jié)果:Uncaught TypeError: Illegal invocation
altwrite()函數(shù)改變this的指向global或window對象爽丹,導致執(zhí)行時提示非法調(diào)用異常,正確的方案就是使用bind()方法:
altwrite.bind(document)("hello")
當然也可以使用call()方法:
altwrite.call(document, "hello")
希望我的理解可以給你們提供一些幫助辛蚊,學識有限粤蝎,如果有地方出現(xiàn)錯誤或者有更好的方法去實現(xiàn),歡迎私信袋马!