成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解 —— call() 和 apply()

curried / 1188人閱讀

摘要:使用將的改為了對(duì)象上面這個(gè)例子可以很直觀地理解的工作原理。所以在執(zhí)行時(shí),函數(shù)內(nèi)部的則會(huì)自動(dòng)指向。這是一個(gè)非常好理解的例子。當(dāng)執(zhí)行這個(gè)方法時(shí),獲得的屬性和方法。因此執(zhí)行時(shí)返回。這證明了我們上面的推理是正確的。

js中一個(gè)主要的內(nèi)容就是this的指向問題.

apply()call() 這兩個(gè)方法有共同之處也有不同之處

共同之處

他們都能改變this的指向,都是在特定的作用域中調(diào)用函數(shù),等于設(shè)置函數(shù)體內(nèi)this對(duì)象的值,以擴(kuò)充函數(shù)賴以運(yùn)行的作用域。一般來說,this總是指向調(diào)用某個(gè)方法的對(duì)象,但是使用call()apply()方法時(shí),就會(huì)改變this的指向。

說到他們的功能,我就拿call來舉例子吧,因?yàn)樗麄兊墓δ苁且恢碌摹?/p>

call([thisObj[,arg1[, arg2[, [,.argN]]]]])

call()方法就是用來代替另一個(gè)對(duì)象來調(diào)用這個(gè)方法。call()將一個(gè)函數(shù)的對(duì)象上下文從初始的變?yōu)樾露x的新對(duì)象thisObj。如果沒有這個(gè)對(duì)象,那么就用global來代替.

不同之處

不同之處在于他們傳值的方式不同

applycall兩者在作用上是相同的,但兩者在參數(shù)上有區(qū)別的。對(duì)于第一個(gè)參數(shù)意義都一樣,但對(duì)第二個(gè)參數(shù):apply傳入的是一個(gè)參數(shù)數(shù)組,也就是將多個(gè)參數(shù)組合成為一個(gè)數(shù)組傳入,而call則作為call的參數(shù)傳入(從第二個(gè)參數(shù)開始)。如 func.call(func1,var1,var2,var3)對(duì)應(yīng)的 apply 寫法為:func.apply(func1,[var1,var2,var3])

function sayName(){
    alert(this.name);
}

var p = {
    name: "zjj"
};

sayName.call(p); // zjj 
//使用call將sayName的this改為了p對(duì)象
上面這個(gè)例子可以很直觀地理解 call 的工作原理。也就是說,當(dāng)在函數(shù)中調(diào)用 call 這個(gè)方法時(shí),函數(shù)內(nèi)部的 this 對(duì)象會(huì)自動(dòng)指向 call 方法中的第一個(gè)參數(shù)。在上面這個(gè)例子中也就是 peter 這個(gè)對(duì)象了。所以在執(zhí)行 sayName.call(peter) 時(shí),函數(shù)內(nèi)部的 this.name 則會(huì)自動(dòng)指向 peter.name 。故最終結(jié)果為 peter。這是一個(gè)非常好理解的例子。接下來來看較為復(fù)雜的情況。

call()

function person(){
    this.name = "zjj";
    this.say = function() {
        console.log(this.name);
    }
}

function person1(){
    this.name = "zmf";
}

var sm = new Person1();

person.call(sm); //將person的this指向改為了sm
sm.say(); // 這里之所以能使用say,是因?yàn)楝F(xiàn)在sm指向了person,有say這個(gè)方法;
    window.color = "red";
    document.color = "yellow";

    var s1 = {color: "blue" };
    function changeColor(){
        console.log(this.color);
    }

    changeColor.call();         //red (默認(rèn)傳遞參數(shù))
    changeColor.call(window);   //red
    changeColor.call(document); //yellow
    changeColor.call(this);     //red
    changeColor.call(s1);       //blue
// 在call中傳入函數(shù)
function class1 () {  
    this.message = "yeah";
}

function class2 () {  
    this.sayMessage = function () {
        alert(this.message);
    }
}

class2.call(class1);   // 可以理解為class2給了class1;
alert(class1.sayMessage);  // 因?yàn)榧词故菍lass2的給了class1,但是sayMessage中的this.message仍然還是class2的。
class1.sayMessage(); //undefined
var message = "hi";

function class1 () {  
    this.message = "yeah";
}

function class2 () {  
    this.message = "hello";
    this.sayMessage = function () {
        alert(this.message);
    }
}

class2.call(class1);  
alert(class1.sayMessage);  
class1.sayMessage(); // hello

class1.message = "msg";

class1.sayMessage(); //msg  

第一次調(diào)用 sayMessage 方法,返回 hello 。我們?cè)賮砜匆幌?class2.call(class1) 這個(gè)過程。當(dāng)執(zhí)行這個(gè)方法時(shí),class1 獲得 class2 的 message 屬性和 sayMessage 方法。所以此時(shí)有 class1.message = "hello" ,class1.sayMessage = function () {alert(this.message)}。因此執(zhí)行 sayMessage 時(shí)返回 hello。當(dāng)我們手動(dòng)修改 class1.message 時(shí),再調(diào)用這個(gè)方法,返回的值為我們修改的值。這證明了我們上面的推理是正確的。

apply()

function add(c,d){
        return this.a + this.b + c + d;
    }

    var s = {a:1, b:2};
    console.log(add.call(s,3,4)); // 1+2+3+4 = 10
    console.log(add.apply(s,[5,6])); // 1+2+5+6 = 14 

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94992.html

相關(guān)文章

  • applycall 詳細(xì)深入理解

    apply 與 call 介紹 function f1(x, y) { console.log(結(jié)果是: + (x + y) + this); } f1(10, 20); //函數(shù)的調(diào)用 // 結(jié)果是:30[object Window] // 此時(shí)的 f1 實(shí)際上是當(dāng)作對(duì)象來使用的,對(duì)象可以調(diào)用方法 f1.apply(); // 結(jié)果是:NaN[object Window] f1.ca...

    Hegel_Gu 評(píng)論0 收藏0
  • 深入淺出JavaScript之call()、apply()方法

    摘要:的作用在中,方法和方法都是為了改變函數(shù)運(yùn)行時(shí)上下文而存在的,換句話說就是為了改變函數(shù)體內(nèi)部的指向。歡迎前端大牛糾正錯(cuò)誤,如有錯(cuò)誤我會(huì)及時(shí)改正。 寫在前面: 隔了很長時(shí)間了,也不知道寫點(diǎn)什么。最近一直在研究ES6,一直想寫出來的文章能對(duì)初學(xué)者或者是在學(xué)習(xí)JS路上有所幫助的。這就是我的初衷。 call、apply的作用 在JavaScript中,call()方法和apply()方法都是為了...

    Cympros 評(píng)論0 收藏0
  • 深入理解JavaScript(三):獲取數(shù)組中的最大值方法(this,apply

    摘要:三個(gè)方法的作用,都是改變的指向,只是用法稍微有些區(qū)別什么是既不指向函數(shù)自身,也不指函數(shù)的詞法作用域。它在函數(shù)定義的時(shí)候是確定不了的在函數(shù)被調(diào)用時(shí)才發(fā)生的綁定,也就是說具體指向什么,取決于你是怎么調(diào)用的函數(shù)。 1.排序法 思路:給數(shù)組先排序(由大到小排序),第一項(xiàng)就是最大值 let arr = [1,5,6,7,9,20,40,2,3]; let max1 = arr.sort(func...

    canopus4u 評(píng)論0 收藏0
  • 從Ecma規(guī)范深入理解this

    摘要:本文總結(jié)了的各種情況,并從規(guī)范的角度探討了的具體實(shí)現(xiàn),希望對(duì)大家理解有所幫助。規(guī)范規(guī)范里面詳細(xì)介紹了的實(shí)現(xiàn)細(xì)節(jié),通過閱讀規(guī)范,我們可以更準(zhǔn)確的理解上述四種情況到底是怎么回事。由于本人能力有限,如有理解錯(cuò)誤的地方還望指出。 this是面向?qū)ο缶幊讨械囊粋€(gè)概念,它一般指向當(dāng)前方法調(diào)用所在的對(duì)象,這一點(diǎn)在java、c++這類比較嚴(yán)格的面向?qū)ο缶幊陶Z言里是非常明確的。但是在javascript...

    rottengeek 評(píng)論0 收藏0
  • 深入理解 Javascript 之 this

    摘要:深入淺出的理解問題的由來寫法一寫法二雖然和指向同一個(gè)函數(shù),但是執(zhí)行結(jié)果可能不一樣。該變量由運(yùn)行環(huán)境提供。所以,就出現(xiàn)了,它的設(shè)計(jì)目的就是在函數(shù)體內(nèi)部,指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。 深入淺出this的理解 問題的由來 var obj = { foo: function(){} } var foo = obj.foo; // 寫法一 obj.foo(); // 寫法二 foo...

    OnlyMyRailgun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<