深入淺出妙用 Javascript 中 apply、call、bind

來源:互聯網
上載者:User

標籤:font   不同   inf   方式   object   yellow   分析   ons   先來   

原文地址:深入淺出妙用 Javascript 中 apply、call、bind

apply、call

在 javascript 中,call 和 apply 都是為了改變某個函數運行時的上下文(context)而存在的,換句話說,就是為了改變函數體內部 this 的指向。

JavaScript 的一大特點是,函數存在「定義時上下文」和「運行時上下文」以及「上下文是可以改變的」這樣的概念。

先來一個栗子:
eg1:

function fruits() {}fruits.prototype = {color: "red",say: function() {console.log("My color is " + this.color);}}var apple = new fruits;banana = {color: "yellow"}apple.say.call(banana); //My color is yellowapple.say.apply(banana); //My color is yellow



但是如果我們有一個對象banana= {color : "yellow"} ,我們不想對它重新定義 say 方法,那麼我們可以通過 call 或 apply 用 apple 的 say 方法。

所以,可以看出 call 和 apply 是為了動態改變 this 而出現的,當一個 object 沒有某個方法(本栗子中banana沒有say方法),但是其他的有(本栗子中apple有say方法),我們可以藉助call或apply用其它對象的方法來操作。


 apply、call 的區別

對於 apply、call 二者而言,作用完全一樣,只是接受參數的方式不太一樣。例如,有一個函數定義如下:

var func = function(arg1, arg2) {};


就可以通過如下方式來調用:

func.call(this, arg1, arg2);func.apply(this, [arg1, arg2])


其中 this 是你想指定的上下文,他可以是任何一個 JavaScript 對象(JavaScript 中一切皆對象),call 需要把參數按順序傳遞進去,而 apply 則是把參數放在數組裡。  

JavaScript 中,某個函數的參數數量是不固定的,因此要說適用條件的話,當你的參數是明確知道數量時用 call 。

而不確定的時候用 apply,然後把參數 push 進數組傳遞進去。當參數數量不確定時,函數內部也可以通過 arguments 這個數組來遍曆所有的參數。

拜讀此文後,思索:


問題1:

eg2:

var numbers = [5, 458 , 120 , -215 ];Math.max.apply(numbers);-Infinity


給numbers綁定Math.max為什麼不行?

而此方式卻可以:

eg3:

var numbers = [5, 458 , 120 , -215 ];var maxInNumbers = Math.max.apply(Math, numbers); //458


分析:
當任意聲明一個Null 物件:

eg4:

var numbers = [5, 458 , 120 , -215 ];var obj = {};Math.max.apply(obj,numbers); //458


所以,可以看出:Math.max方法是需要傳參,而需要進行比較的數組numbers不是作為this指向的對象obj,而是作為比較的參數傳入。與eg1中不同的是,是否需要參數。

問題2:

對象方法繼承的有效期間多久?是繼承後一直擁有嗎?還是只存在call ,apply方法運行時?

eg5:

function fruits() {}fruits.prototype = {color: "red",say: function() {console.log("My color is " + this.color);}}var apple = new fruits;banana = {color: "yellow"}apple.say.call(banana); //My color is yellowconsole.log(banana);//Object{color: "yellow",__proto__: Object}


分析:
banana沒有say方法。所以,利用call ,apply方法繼承後是有期限的,只是在函數「運行時上下文」有效。

深入淺出妙用 Javascript 中 apply、call、bind

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.