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

資訊專欄INFORMATION COLUMN

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

chaosx110 / 1064人閱讀

摘要:輸出的作用與和一樣,都是可以改變函數(shù)運行時上下文,區(qū)別是和在調用函數(shù)之后會立即執(zhí)行,而方法調用并改變函數(shù)運行時上下文后,返回一個新的函數(shù),供我們需要時再調用。

前言

js中的call(), apply()bind()Function.prototype下的方法,都是用于改變函數(shù)運行時上下文,最終的返回值是你調用的方法的返回值,若該方法沒有返回值,則返回undefined。這幾個方法很好地體現(xiàn)了js函數(shù)式語言特性,在js中幾乎每一次編寫函數(shù)式語言風格的代碼,都離不開call和apply,能夠熟練運用它們,是真正成為一名jser程序員的重要一步。

apply()

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

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

注意這里apply()的第一個參數(shù)是null,在非嚴格模式下,第一個參數(shù)為null或者undefined時會自動替換為指向全局對象,
apply()的第二個參數(shù)為數(shù)組或類數(shù)組。

call()

call()apply()的一顆語法糖,作用和 apply() 一樣,同樣可實現(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ù)運行時上下文,區(qū)別是call()apply()在調用函數(shù)之后會立即執(zhí)行,而bind()方法調用并改變函數(shù)運行時上下文后,返回一個新的函數(shù),供我們需要時再調用。

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

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

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

Function.prototype.bind = function(context) {
  // 保存調用函數(shù)的引用,這里是getName()
  var self = this;
  // 返回一個新函數(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ù),相當于執(zhí)行getName.apply(person);

如何選用

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

如果確定函數(shù)可接收多少個參數(shù),并且想一目了然表達形參和實參的對應關系,用call();

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

總結

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

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

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

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

轉載請注明本文地址:http://systransis.cn/yun/108596.html

相關文章

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

    摘要:理解文章中已經(jīng)比較全面的分析了在中的指向問題,用一句話來總結就是的指向一定是在執(zhí)行時決定的,指向被調用函數(shù)的對象。與和直接執(zhí)行原函數(shù)不同的是,返回的是一個新函數(shù)。這個新函數(shù)包裹了原函數(shù),并且綁定了的指向為傳入的。 理解 JavaScript this 文章中已經(jīng)比較全面的分析了 this 在 JavaScript 中的指向問題,用一句話來總結就是:this 的指向一定是在執(zhí)行時決定的,...

    duan199226 評論0 收藏0
  • ES5 call,apply,bind方法總結(包括理解this的指向問題)

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

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

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

    canopus4u 評論0 收藏0
  • 復習javascriptcall,apply,bind的用法

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

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

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

    LiveVideoStack 評論0 收藏0

發(fā)表評論

0條評論

chaosx110

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<