js中的call() / apply()

我們先看一個簡單的例子 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 這種裝逼的寫法呢;


 

  1. 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() 就是用來讓括號裏的對象 來集成括號外的函數的屬性!可以稱之爲繼承!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章