摘要:用的比較多的,通過(guò)選擇的節(jié)點(diǎn)是一種類似的。它不能應(yīng)用下的等方法。和都是為了改變某個(gè)函數(shù)運(yùn)行時(shí)的即上下文而存在的,換句話說(shuō),就是為了改變函數(shù)體內(nèi)部的指向。這些的話也就能明白它倆的用處以及它們定義。
要明白call以及apply 首先得知道他們的用法如何有什么用
function cat() {} cat.prototype = { food: "fish", say: function () { alert("I love " + this.food); } } var blackCat = new cat; blackCat.say();
但是如果我們有一個(gè)對(duì)象whiteDog = {food:"bone"},我們不想對(duì)它重新定義say方法,那么我們可以通過(guò)call或apply用blackCat的say方法:blackCat.say.call(whiteDog);
所以,可以看出call和apply是為了動(dòng)態(tài)改變this而出現(xiàn)的,當(dāng)一個(gè)object沒(méi)有某個(gè)方法,但是其他的有,我們可以借助call或apply用其它對(duì)象的方法來(lái)操作。
用的比較多的,通過(guò)document.getElementsByTagName選擇的dom 節(jié)點(diǎn)是一種類似array的array。它不能應(yīng)用Array下的push,pop等方法。我們可以通過(guò):
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));
這樣domNodes就可以應(yīng)用Array下的所有方法了。
call 和 apply 都是為了改變某個(gè)函數(shù)運(yùn)行時(shí)的 context 即上下文而存在的,換句話說(shuō),就是為了改變函數(shù)體內(nèi)部 this 的指向。因?yàn)?JavaScript 的函數(shù)存在「定義時(shí)上下文」和「運(yùn)行時(shí)上下文」以及「上下文是可以改變的」這樣的概念。
二者的作用完全一樣,只是接受參數(shù)的方式不太一樣。例如,有一個(gè)函數(shù) func1 定義如下:
var func1 = function(arg1, arg2) {};
就可以通過(guò) func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 來(lái)調(diào)用。其中 this 是你想指定的上下文,他可以任何一個(gè) JavaScript 對(duì)象(JavaScript 中一切皆對(duì)象),call 需要把參數(shù)按順序傳遞進(jìn)去,而 apply 則是把參數(shù)放在數(shù)組里。
JavaScript 中,某個(gè)函數(shù)的參數(shù)數(shù)量是不固定的,因此要說(shuō)適用條件的話,當(dāng)你的參數(shù)是明確知道數(shù)量時(shí),用 call,而不確定的時(shí)候,用 apply,然后把參數(shù) push 進(jìn)數(shù)組傳遞進(jìn)去。當(dāng)參數(shù)數(shù)量不確定時(shí),函數(shù)內(nèi)部也可以通過(guò) arguments 這個(gè)數(shù)組來(lái)便利所有的參數(shù)。
這些的話也就能明白它倆的用處以及它們定義。
我也是從知乎大牛的回答里面看到然后總結(jié)下來(lái)的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/81481.html
摘要:輸出的作用與和一樣,都是可以改變函數(shù)運(yùn)行時(shí)上下文,區(qū)別是和在調(diào)用函數(shù)之后會(huì)立即執(zhí)行,而方法調(diào)用并改變函數(shù)運(yùn)行時(shí)上下文后,返回一個(gè)新的函數(shù),供我們需要時(shí)再調(diào)用。 前言 js中的call(), apply()和bind()是Function.prototype下的方法,都是用于改變函數(shù)運(yùn)行時(shí)上下文,最終的返回值是你調(diào)用的方法的返回值,若該方法沒(méi)有返回值,則返回undefined。這幾個(gè)方法...
摘要:所以,這篇文章將通過(guò)一段非常簡(jiǎn)潔的等式,把當(dāng)中一個(gè)相對(duì)較難的知識(shí)點(diǎn),,和給串聯(lián)起來(lái)要理解當(dāng)中的這三個(gè)關(guān)鍵字,首先得弄清楚它們是用來(lái)干嘛的。方案讓吃掉,直接消化吸收的所有能力。 關(guān)于JS當(dāng)中的call,apply和bind,相信大家和我一樣,已經(jīng)看過(guò)了無(wú)數(shù)篇相關(guān)的文章,都有自己的理解。所以這篇文章并非什么科普類的文章,僅僅是把我自己的理解記錄下來(lái)。 我的學(xué)習(xí)習(xí)慣,是喜歡把各種看似孤立的知...
摘要:無(wú)參數(shù)當(dāng)前當(dāng)前文檔中其所在在位置從開(kāi)始工具函數(shù)函數(shù)函數(shù)包裝器可以不用了工具函數(shù)通過(guò)類名來(lái)選取元素父級(jí)對(duì)象類名獲取到的節(jié)點(diǎn)數(shù)組事件添加函數(shù)需要綁定事件的對(duì)象事件類型事件觸發(fā)執(zhí)行的函數(shù)標(biāo)準(zhǔn)修改下指向的問(wèn)題最后選擇 VQuery-封裝自己的JQuery 標(biāo)簽(空格分隔): JS 封裝自己的jQuery--vQuery vQurey選擇器 VQuery類 elements屬性,存儲(chǔ)選擇的元素...
摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識(shí),其實(shí)都是來(lái)自于實(shí)踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。 開(kāi)篇 前端開(kāi)發(fā)是一個(gè)非常特殊的行業(yè),它的歷史實(shí)際上不是很長(zhǎng),但是知識(shí)之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研...
摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識(shí),其實(shí)都是來(lái)自于實(shí)踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。開(kāi)篇 前端開(kāi)發(fā)是一個(gè)非常特殊的行業(yè),它的歷史實(shí)際上不是很長(zhǎng),但是知識(shí)之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系...
閱讀 1793·2023-04-25 15:51
閱讀 2502·2021-10-13 09:40
閱讀 2137·2021-09-23 11:22
閱讀 3247·2019-08-30 14:16
閱讀 2657·2019-08-26 13:35
閱讀 1853·2019-08-26 13:31
閱讀 880·2019-08-26 11:39
閱讀 2739·2019-08-26 10:33