摘要:輸出的作用與和一樣,都是可以改變函數(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()是apply()的一顆語法糖,作用和 apply() 一樣,同樣可實現(xiàn)繼承,唯一的區(qū)別就在于call()接收的是參數(shù)列表,而apply()則接收參數(shù)數(shù)組。
var max = Math.max.call(null, 1, 2, 3, 4, 5); console.log(max); // 輸出5bind()
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
摘要:理解文章中已經(jīng)比較全面的分析了在中的指向問題,用一句話來總結就是的指向一定是在執(zhí)行時決定的,指向被調用函數(shù)的對象。與和直接執(zhí)行原函數(shù)不同的是,返回的是一個新函數(shù)。這個新函數(shù)包裹了原函數(shù),并且綁定了的指向為傳入的。 理解 JavaScript this 文章中已經(jīng)比較全面的分析了 this 在 JavaScript 中的指向問題,用一句話來總結就是:this 的指向一定是在執(zhí)行時決定的,...
總結call,apply,bind方法的理解使用和區(qū)別。 call,apply,bind這三個方法在JavaScript中是用來改變函數(shù)調用的this指向。那么改變函數(shù)this指向有什么用呢?我們先來看一段代碼 var a= { name:harden, fn:function () { console.log(this.name); } } var b =...
摘要:三個方法的作用,都是改變的指向,只是用法稍微有些區(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...
摘要:綁定函數(shù)被調用時,也接受預設的參數(shù)提供給原函數(shù)。一個綁定函數(shù)也能使用操作符創(chuàng)建對象這種行為就像把原函數(shù)當成構造器。 一直很難理解js中的call apply bind,在w3schools,mdn閱讀了,也看了很多相關的文章,今天我來寫下我理解的call apply bind 首先創(chuàng)建一個函數(shù) function man(){} man.prototype = { name: ...
摘要:,,和都是用來改變函數(shù)執(zhí)行時的上下文也就是說改變的指向問題,是的方法,引入是因為沒有將設置成行參。一般都是庫里面用不推薦自己使用和。和唯一區(qū)別是參數(shù)不一樣,是的語法糖是返回一個新函數(shù)供以后調用,相比其他兩個比較常用。而和是立即調用。 apply(),call(),和bind()都是用來改變函數(shù)執(zhí)行時的上下文也就是說改變this的指向問題,是prototype的方法,引入是因為js沒有將...
閱讀 383·2023-04-25 16:38
閱讀 1497·2021-09-26 09:46
閱讀 3342·2021-09-08 09:35
閱讀 2793·2019-08-30 12:54
閱讀 3260·2019-08-29 17:06
閱讀 1032·2019-08-29 14:06
閱讀 3356·2019-08-29 13:00
閱讀 3473·2019-08-28 17:53