成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

理解JavaScript中的call,apply和bind方法

chaosx110 / 1112人閱讀

摘要:輸出的作用與和一樣,都是可以改變函數(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è)方法很好地體現(xiàn)了js函數(shù)式語言特性,在js中幾乎每一次編寫函數(shù)式語言風(fēng)格的代碼,都離不開call和apply,能夠熟練運(yùn)用它們,是真正成為一名jser程序員的重要一步。

apply()

使用 apply, 你可以繼承其他對(duì)象的方法:

var max = Math.max.apply(null, [1, 2, 3, 4, 5]);
console.log(max); // 輸出5

注意這里apply()的第一個(gè)參數(shù)是null,在非嚴(yán)格模式下,第一個(gè)參數(shù)為null或者undefined時(shí)會(huì)自動(dòng)替換為指向全局對(duì)象,
apply()的第二個(gè)參數(shù)為數(shù)組或類數(shù)組。

call()

call()apply()的一顆語法糖,作用和 apply() 一樣,同樣可實(shí)現(xiàn)繼承,唯一的區(qū)別就在于call()接收的是參數(shù)列表,而apply()則接收參數(shù)數(shù)組。

var max = Math.max.call(null, 1, 2, 3, 4, 5);
console.log(max); // 輸出5
bind()

bind()的作用與call()apply()一樣,都是可以改變函數(shù)運(yùn)行時(shí)上下文,區(qū)別是call()apply()在調(diào)用函數(shù)之后會(huì)立即執(zhí)行,而bind()方法調(diào)用并改變函數(shù)運(yùn)行時(shí)上下文后,返回一個(gè)新的函數(shù),供我們需要時(shí)再調(diào)用。

var person = {
  name: "person",
  getName: function() {
    return this.name;
  }
}
var boy = {
   name: "twy"
}
// bind()返回一個(gè)新函數(shù),供以后調(diào)
var getName = person.getName.bind(boy);

// 現(xiàn)在調(diào)用
console.log(getName());    // 輸出wy

apply()模擬實(shí)現(xiàn)bind()

Function.prototype.bind = function(context) {
  // 保存調(diào)用函數(shù)的引用,這里是getName()
  var self = this;
  // 返回一個(gè)新函數(shù)
  return function(){
    return self.apply(context, arguments);
  }
}
var person = {
  name: "twy"
}
var getName = function(){
  console.info(this.name);
}.bind(person);
// 執(zhí)行bind()方法內(nèi)返回的新函數(shù)
getName();

在返回的新函數(shù)內(nèi)部,self.apply(context, arguments)才是執(zhí)行原來的getName函數(shù),相當(dāng)于執(zhí)行getName.apply(person);

如何選用

如果不需要關(guān)心具體有多少參數(shù)被傳入函數(shù),選用apply();

如果確定函數(shù)可接收多少個(gè)參數(shù),并且想一目了然表達(dá)形參和實(shí)參的對(duì)應(yīng)關(guān)系,用call();

如果我們想要將來再調(diào)用方法,不需立即得到函數(shù)返回結(jié)果,則使用bind();

總結(jié)

call()、apply()bind()都是用來改變函數(shù)執(zhí)行時(shí)的上下文,可借助它們實(shí)現(xiàn)繼承;

call()apply()唯一區(qū)別是參數(shù)不一樣,call()apply()的語法糖;

bind()是返回一個(gè)新函數(shù),供以后調(diào)用,而apply()call()是立即調(diào)用。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/108596.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
  • ES5 call,apply,bind方法總結(jié)(包括理解this的指向問題)

    總結(jié)call,apply,bind方法的理解使用和區(qū)別。 call,apply,bind這三個(gè)方法在JavaScript中是用來改變函數(shù)調(diào)用的this指向。那么改變函數(shù)this指向有什么用呢?我們先來看一段代碼 var a= { name:harden, fn:function () { console.log(this.name); } } var b =...

    nanchen2251 評(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
  • 復(fù)習(xí)javascriptcall,apply,bind的用法

    摘要:綁定函數(shù)被調(diào)用時(shí),也接受預(yù)設(shè)的參數(shù)提供給原函數(shù)。一個(gè)綁定函數(shù)也能使用操作符創(chuàng)建對(duì)象這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。 一直很難理解js中的call apply bind,在w3schools,mdn閱讀了,也看了很多相關(guān)的文章,今天我來寫下我理解的call apply bind 首先創(chuàng)建一個(gè)函數(shù) function man(){} man.prototype = { name: ...

    darryrzhong 評(píng)論0 收藏0
  • 理解javascriptapply( ), call( ), bind( )

    摘要:,,和都是用來改變函數(shù)執(zhí)行時(shí)的上下文也就是說改變的指向問題,是的方法,引入是因?yàn)闆]有將設(shè)置成行參。一般都是庫(kù)里面用不推薦自己使用和。和唯一區(qū)別是參數(shù)不一樣,是的語法糖是返回一個(gè)新函數(shù)供以后調(diào)用,相比其他兩個(gè)比較常用。而和是立即調(diào)用。 apply(),call(),和bind()都是用來改變函數(shù)執(zhí)行時(shí)的上下文也就是說改變this的指向問題,是prototype的方法,引入是因?yàn)閖s沒有將...

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

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

0條評(píng)論

chaosx110

|高級(jí)講師

TA的文章

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