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

資訊專欄INFORMATION COLUMN

Javascript:call(),apply()和bind()

WrBug / 1760人閱讀

摘要:在面向?qū)ο蟮闹?,我們了解到在中,一切都是?duì)象。到目前為止,我們已將函數(shù)視為由名稱可選,也可以是匿名函數(shù)組成的對(duì)象及其在調(diào)用時(shí)執(zhí)行的代碼。這意味著,我們可以調(diào)用任何函數(shù),并在調(diào)用函數(shù)中明確指定。和用于完全相同的目的。

What" s “this”

在面向?qū)ο蟮腏S中,我們了解到在JS中,一切都是對(duì)象。因?yàn)橐磺卸际菍?duì)象,我們開始明白我們可以為函數(shù)設(shè)置和訪問其他屬性。而this提供了一種更優(yōu)雅的方式隱式“傳遞”一個(gè)對(duì)象的引用。
關(guān)于this,我們常見的誤區(qū):

認(rèn)為this指向函數(shù)本身

function f1() {
    console.log(this)
}
f1() // window 

認(rèn)為this指向函數(shù)作用域

關(guān)于這兩個(gè)誤區(qū),其實(shí)在官方文檔中有很明確的說明。

函數(shù)的調(diào)用方式?jīng)Q定了this的值。

那么this并不是指向函數(shù)本身,也不是指向函數(shù)的作用域,而是在運(yùn)行時(shí)進(jìn)行綁定的,并不是在編寫時(shí)綁定,它的上下文也取決于函數(shù)調(diào)用時(shí)的各種條件。this的綁定和函數(shù)聲明的位置沒有任何關(guān)系,只取決于函數(shù)的調(diào)用方式。

它指向什么完全取決于函數(shù)在哪里被調(diào)用,也就是說,誰調(diào)用,誰負(fù)責(zé)

而bind()、apply()、call()則是可以更改this指向的方法

(這部分并不是翻譯的原文,因?yàn)樵年P(guān)于this講的不是很細(xì)致,而我覺得理解了this,才能了解bind()、apply()、call()有什么用處。所以這塊是我根據(jù)《你不知道的JavaScript 上卷》this的部分,粗略的介紹了部分,有興趣的話可以看看那本書,關(guān)于this講的很細(xì)致。)

call(), apply() and bind()

到目前為止,我們已將函數(shù)視為由名稱(可選,也可以是匿名函數(shù))組成的對(duì)象及其在調(diào)用時(shí)執(zhí)行的代碼。但這不是全部真相,實(shí)際上函數(shù)看起來更接近下面的圖像:

現(xiàn)在,我將通過示例介紹每個(gè)函數(shù)中出現(xiàn)的這3種類似方法。

bind()

官方文檔說: bind()方法創(chuàng)建一個(gè)新函數(shù),當(dāng)調(diào)用時(shí),將其關(guān)鍵字設(shè)置為提供的值。

這非常強(qiáng)大。它讓我們在調(diào)用函數(shù)時(shí)明確定義它的值。我們來看看cooooode:

var pokemon = {
    firstname: "Pika",
    lastname: "Chu ",
    getPokeName: function() {
        var fullname = this.firstname + " " + this.lastname;
        return fullname;
    }
};

var pokemonName = function() {
    console.log(this.getPokeName() + "I choose you!");
};

var logPokemon = pokemonName.bind(pokemon); // creates new object and binds pokemon. "this" of pokemon === pokemon now

logPokemon(); // "Pika Chu I choose you!"

讓我們分解吧。當(dāng)我們使用bind()方法時(shí):

JS引擎正在創(chuàng)建一個(gè)新的pokemonName實(shí)例,并將pokemon綁定為此變量。重要的是要理解它復(fù)制了pokemonName函數(shù)。

在創(chuàng)建了pokemonName函數(shù)的副本之后,它可以調(diào)用logPokemon(),盡管它最初不在pokemon對(duì)象上。它現(xiàn)在將識(shí)別其屬性(Pika和Chu)及其方法。

很酷的是,在我們bind()一個(gè)值后,我們可以像使用任何其他正常函數(shù)一樣使用該函數(shù)。我們甚至可以更新函數(shù)來接受參數(shù),并像這樣傳遞它們:

var pokemon = {
    firstname: "Pika",
    lastname: "Chu ",
    getPokeName: function() {
        var fullname = this.firstname + " " + this.lastname;
        return fullname;
    }
};

var pokemonName = function(snack, hobby) {
    console.log(this.getPokeName() + "I choose you!");
    console.log(this.getPokeName() + " loves " + snack + " and " + hobby);
};

var logPokemon = pokemonName.bind(pokemon); // creates new object and binds pokemon. "this" of pokemon === pokemon now

logPokemon("sushi", "algorithms"); // Pika Chu  loves sushi and algorithms
call(), apply()

call()的官方文檔說: call()方法調(diào)用具有給定此值的函數(shù)和多帶帶提供的參數(shù)。

這意味著,我們可以調(diào)用任何函數(shù),并在調(diào)用函數(shù)中明確指定what_ this _should reference_。真的類似于bind()方法!這絕對(duì)可以讓我們免于編寫hacky代碼。

bind()和call()之間的主要區(qū)別在于call()方法:

1、接受其他參數(shù)

2、執(zhí)行它立即調(diào)用的函數(shù)。

3、call()方法不會(huì)復(fù)制正在調(diào)用它的函數(shù)。

call()和apply()用于完全相同的目的。它們之間的唯一區(qū)別是_ call()期望所有參數(shù)都多帶帶傳遞,而apply()需要一個(gè)數(shù)組。例:

var pokemon = {
    firstname: "Pika",
    lastname: "Chu ",
    getPokeName: function() {
        var fullname = this.firstname + " " + this.lastname;
        return fullname;
    }
};

var pokemonName = function(snack, hobby) {
    console.log(this.getPokeName() + " loves " + snack + " and " + hobby);
};

pokemonName.call(pokemon,"sushi", "algorithms"); // Pika Chu  loves sushi and algorithms
pokemonName.apply(pokemon,["sushi", "algorithms"]); // Pika Chu  loves sushi and algorithms

這些內(nèi)置的方法存在于每個(gè)JS函數(shù)中都非常有用。即使你最終沒有在日常編程中使用它們,你仍然會(huì)在閱讀其他人的代碼時(shí)經(jīng)常遇到它們。

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

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

相關(guān)文章

  • 理解 JavaScript call()/apply()/bind()

    摘要:理解文章中已經(jīng)比較全面的分析了在中的指向問題,用一句話來總結(jié)就是的指向一定是在執(zhí)行時(shí)決定的,指向被調(diào)用函數(shù)的對(duì)象。與和直接執(zhí)行原函數(shù)不同的是,返回的是一個(gè)新函數(shù)。這個(gè)新函數(shù)包裹了原函數(shù),并且綁定了的指向?yàn)閭魅氲摹? 理解 JavaScript this 文章中已經(jīng)比較全面的分析了 this 在 JavaScript 中的指向問題,用一句話來總結(jié)就是:this 的指向一定是在執(zhí)行時(shí)決定的,...

    duan199226 評(píng)論0 收藏0
  • JavaScript函數(shù)的call,applybind

    摘要:它們有明確的和成員函數(shù)的定義,只有的實(shí)例才能調(diào)用這個(gè)的成員函數(shù)。用和調(diào)用函數(shù)里用和來指定函數(shù)調(diào)用的,即指針的指向。同樣,對(duì)于一個(gè)后的函數(shù)使用或者,也無法改變它的執(zhí)行,原理和上面是一樣的。 函數(shù)里的this指針 要理解call,apply和bind,那得先知道JavaScript里的this指針。JavaScript里任何函數(shù)的執(zhí)行都有一個(gè)上下文(context),也就是JavaScri...

    alighters 評(píng)論0 收藏0
  • 理解JavaScript中的call,applybind方法

    摘要:輸出的作用與和一樣,都是可以改變函數(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)用的方法的返回值,若該方法沒有返回值,則返回undefined。這幾個(gè)方法...

    chaosx110 評(píng)論0 收藏0
  • JS中的call、apply、bind方法詳解

    摘要:不能應(yīng)用下的等方法。首先我們可以通過給目標(biāo)函數(shù)指定作用域來簡單實(shí)現(xiàn)方法保存,即調(diào)用方法的目標(biāo)函數(shù)考慮到函數(shù)柯里化的情況,我們可以構(gòu)建一個(gè)更加健壯的這次的方法可以綁定對(duì)象,也支持在綁定的時(shí)候傳參。原因是,在中,多次是無效的。 bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。 apply、call 在 javascript 中,call 和 apply 都是...

    zombieda 評(píng)論0 收藏0
  • JS基礎(chǔ)篇--call、applybind方法詳解

    摘要:首先我們可以通過給目標(biāo)函數(shù)指定作用域來簡單實(shí)現(xiàn)方法保存,即調(diào)用方法的目標(biāo)函數(shù)考慮到函數(shù)柯里化的情況,我們可以構(gòu)建一個(gè)更加健壯的這次的方法可以綁定對(duì)象,也支持在綁定的時(shí)候傳參。原因是,在中,多次是無效的。而則會(huì)立即執(zhí)行函數(shù)。 bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。 apply、call 在 javascript 中,call 和 apply 都是...

    lastSeries 評(píng)論0 收藏0
  • javascript關(guān)于this 以及this的顯示設(shè)置(apply、callbind)

    摘要:如果連續(xù)呢結(jié)果會(huì)是什么結(jié)果還是第一個(gè)原因是,在中,多次是無效的。更深層次的原因,的實(shí)現(xiàn),相當(dāng)于使用函數(shù)在內(nèi)部包了一個(gè),第二次相當(dāng)于再包住第一次故第二次以后的是無法生效的。 this 1.其實(shí)js中的this沒那么難理解,當(dāng)找不到this時(shí)記住一句話:誰調(diào)我,我就指誰!new 誰指誰 function text1(){ console.log(this); //指wind...

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

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

0條評(píng)論

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