最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

徹底搞懂JavaScript中的apply和call方法(必看)

 更新時間:2017年09月18日 08:39:15   投稿:jingxian  
下面小編就為大家?guī)硪黄獜氐赘愣甁avaScript中的apply和call方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

call和apply都是為了改變某個函數(shù)運行的context上下文而存在的,即為了改變函數(shù)體內(nèi)部this的指向。因為JavaScript的函數(shù)存在定義上下文和運行時上下文以及上下文是可以改變的概念。

回到目錄定義

fun.apply(thisArg, [argsArray])
fun.call(thisArg, arg1,arg2, ...)

其中thisArg可以為null或undefined,此時表示全局對象,更詳細見MDN:apply()、call()

二者的作用完全一樣,只是接受參數(shù)的方式不太一樣。例如,有一個函數(shù)定義如下:

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

可以通過func1.call(this, arg1, arg2);或者func1.apply(this, [arg1, arg2])來調(diào)用。其中this是你想指定的上下文,它可以是任意一個JavaScript對象(JavaScript一切皆對象),call需要把參數(shù)傳遞進去,而apply則把參數(shù)放在數(shù)組里。

因為在JavaScript中,某個函數(shù)的參數(shù)數(shù)量是不固定的,當(dāng)你的參數(shù)明確知道數(shù)量時,用call,而不確定的時候用apply,然后把參數(shù)push進數(shù)組傳遞進去。當(dāng)參數(shù)數(shù)量不確定時,函數(shù)內(nèi)部也可以通過arguments這個數(shù)組來遍歷所有的參數(shù)。

回到目錄一個例子

在JavaScript OOP中,我們經(jīng)常會這樣定義:

funciton programmer() {
}

programmer.prototype = {
  hobby: 'programming',
  say.function() {
    alert('I love' + this.hobby);
  }
}

var xiaoMing = new programmer();
xiaoMing.say();

此時如果我們有一個設(shè)計妹子對象xiaoHua = {hobby: 'designing'};我們不想對它重新定義say方法,那么我們可以通過call或apply使用xiaoMing的say方法:xiaoMing.say.call(xiaoHua)。

由此可看出,call和apply都是為了動態(tài)改變this而出現(xiàn)的,當(dāng)一個object沒有某個方法或?qū)傩詴r,但是其他的對象有,則可以借助call或apply來使用其他對象的方法來操作。

obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

兩者都是把obj(即this)綁定到thisObj,這時候thisObj具備(或繼承)了obj的屬性和方法

其中比較常見的,通過document.getElementByTagName選擇的節(jié)點是一種類數(shù)組,它不能應(yīng)用Array下的push,pop等方法。但我們可以通過:

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

Array.prototype.slice.call能所有具有l(wèi)ength屬性的對象轉(zhuǎn)為數(shù)組,這樣domNodes就可以應(yīng)用Array下的所有方法了。

以上這篇徹底搞懂JavaScript中的apply和call方法(必看)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于JS實現(xiàn)飛機大戰(zhàn)游戲的示例代碼

    基于JS實現(xiàn)飛機大戰(zhàn)游戲的示例代碼

    這篇文章主要為大家詳細介紹了如何利用JS實現(xiàn)飛機大戰(zhàn)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • JS中的oninput和onchange事件的區(qū)別及如何正確使用

    JS中的oninput和onchange事件的區(qū)別及如何正確使用

    在JavaScript中,oninput和onchange事件是用于處理用戶輸入的常見事件,本文將介紹oninput和onchange事件的區(qū)別,以及如何在實際開發(fā)中正確使用它們,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • 根據(jù)后端返回的json數(shù)據(jù)快速生成ts類型的實現(xiàn)代碼

    根據(jù)后端返回的json數(shù)據(jù)快速生成ts類型的實現(xiàn)代碼

    在前端開發(fā)中,我們通常需要處理來自后端或其他數(shù)據(jù)源的 JSON 數(shù)據(jù),這些數(shù)據(jù)可能非常復(fù)雜,包含不同類型的屬性,甚至嵌套對象和數(shù)組,為了更好地使用這些數(shù)據(jù),我們希望將其轉(zhuǎn)換為TypeScript類型定義,以獲得類型檢查和代碼智能提示的好處
    2023-10-10
  • 最新評論

    胶州市| 专栏| 扶沟县| 伊宁市| 沛县| 沂水县| 丰都县| 宾川县| 布尔津县| 潜山县| 高邑县| 吉木乃县| 鄂托克前旗| 百色市| 孙吴县| 山西省| 绥化市| 邢台市| 永安市| 泊头市| 灌阳县| 广南县| 金川县| 抚州市| 垦利县| 尉犁县| 清原| 偏关县| 郓城县| 天等县| 华池县| 洪洞县| 牟定县| 杭锦旗| 许昌县| 丰县| 玛多县| 彰武县| 福清市| 苏尼特左旗| 南开区|