我們先看一個簡單的例子 1+1 = 2 你應該會吧
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,1,1); // 結果是? ‘2’ 還是 ‘0’ 呢
這裏寫代碼片有人說是 1+1 =2; 有人說明顯變成 1-1 = 0 了嘛!
其實 add.call(sub,1,1); 等價於add(1,1) = 2 。。。。。那你這不是腦殘嗎?非要多此一舉 弄個該死的call ,搞毛? 直接 add(1,1) 不行了嗎?
我不太懂了,add.call(sub)了,肯定是add直接sub裏面的減法了呀,不然弄個call幹嘛呀?
什麼場景下會用到call, apply 這種裝逼的寫法呢;
-
call和apply可以用來重新定義函數的執行環境,也就是this的指向; call 和 apply 都是爲了改變某個函數運行時的
context 即上下文而存在的 換句話說,就是爲了改變函數體內部 this 的指向。因爲 JavaScript
的函數存在「定義時上下文」和「運行時上下文」以及「上下文是可以改變的」這樣的概念。call():
- 語法:call(Obj,[arg1][arg1])
我的白話文:
call 就是中間牽線的,sub說 我需要 add 你的方法 和技能,
比如:add會飛天 ,但sub 不會飛,現在sub想飛,但add不讓它飛,所以sub就叫來了 call 這個東西, call直接把add爆菊
加上一個 點 然後把sub抱到括號裏,然後 sub 就直接把add 的“飛天”技能學會了,回到函數
function changeStyle(attr, value)
{
this.style[attr] = value;
}
var box = document.getElementById('box');
window.changeStyle.call(box, "height", "200px");
在這裏,changeStyle函數將被box對象調用,this指向了box對象,如果不用call的話,程序報錯,因爲
window對象中沒有style屬性。apply的用法:
window.changeStyle.apply(box, [‘height’, ‘200px’]);
現在 window對象 “box” 這個div 的高 直接變成200px了,
window.changeStyle.call(box, “height”, “200px”)
等價於 box.style.height=”200px”;
看到這裏應該明白了吧 沒如果還沒明白
apply() 這個用法
window.changeStyle.apply(box, [‘height’, ‘200px’]);
看了這個寫法 你應該明白了把, 啊哈其實 就是寫法 和形式不同而已,本質是一樣的,apply(),是推進到
數組裏而已,也是爲了改變this、
這個,也是爲了偷 add 的飛天技能哈!
總結一句話:call() 就是用來讓括號裏的對象 來集成括號外的函數的屬性!可以稱之爲繼承!