摘要:應(yīng)用場景求數(shù)組中的最大值和最小值并不是最佳選擇是中的靜態(tài)方法,因此必然是沒有使用上下文的必要的。因此綁定只需要用或者占位就可以了。
前言
面試,幾乎每次都會(huì)問到一個(gè)js中關(guān)于call、apply、bind的問題,比如…
怎么利用call、apply來求一個(gè)數(shù)組中最大或者最小值
如何利用call、apply來做繼承
apply、call、bind的區(qū)別和主要應(yīng)用場景
作用首先問個(gè)問題,這三個(gè)函數(shù)的存在意義是什么?答案是改變函數(shù)執(zhí)行時(shí)的上下文,再具體一點(diǎn)就是改變函數(shù)運(yùn)行時(shí)的this指向。
function Person(name) { this.name = name } Person.prototype = { constructor: Person, showName: function() { console.log(this.name) } } var person = new Person("shifeng") person.showName() // 輸入"shifeng"
var animal = { name: "cat }
上面代碼中有一個(gè)對象字面量,他沒有所謂的showName方法,但是我還是想用?怎么辦?(坑爹了,這好像在讓巧媳婦去做無米之炊),不過沒關(guān)系,call、apply、bind可以幫我們干這件事。
// 以下三種都會(huì)輸出"cat" // 1. call person.showName.call(animal) // 2. apply person.showName.apply(animal) // 3. bind person.showName.bind(animal)
我們拿別人的showName方法,并動(dòng)態(tài)改變其上下文幫自己輸出了信息,說到底就是實(shí)現(xiàn)了復(fù)用
區(qū)別上面看起來三個(gè)函數(shù)的作用差不多,干的事幾乎是一樣的,那為什么要存在3個(gè)家伙呢,留一個(gè)不就可以。所以其實(shí)他們干的事從本質(zhì)上講都是一樣的動(dòng)態(tài)的改變this上下文,但是多少還是有一些差別的...
call和apply改變了函數(shù)的this上下文后便執(zhí)行該函數(shù), 而bind則是返回改變了上下文的一個(gè)函數(shù)
他們倆之間的差別在于參數(shù)的區(qū)別,call和aplly的第一個(gè)參數(shù)都是要改變上下文的對象,而call從第二個(gè)參數(shù)開始以參數(shù)列表的形式展現(xiàn),apply則是把除了改變上下文對象的參數(shù)放在一個(gè)數(shù)組里面作為它的第二個(gè)參數(shù)。
fn.call(contextObj, arg1, arg2, arg3...) fn.apply(contextObj, [arg1, arg2, aeg3...])應(yīng)用場景
求數(shù)組中的最大值和最小值(并不是最佳選擇)
var arr = [34,5,3,6,54,6,-67,5,7,6,-8,687] // max、min 是 Math 中的靜態(tài)方法,因此必然是沒有使用上下文的必要的。 // 因此 call、apply 綁定只需要用 null 或者 undefined 占位就可以了。 Math.max.call(null, 34,5,3,6,54,6,-67,5,7,6,-8,687) // 同Math.max(34,5,3,6,54,6,-67,5,7,6,-8,687) Math.max.apply(null, arr) Math.min.call(undefined, 34,5,3,6,54,6,-67,5,7,6,-8,687) Math.min.apply(undefined, arr) // 最佳方法, ES6數(shù)組解構(gòu) Math.max(...arr) Math.min(...arr)
將偽數(shù)組轉(zhuǎn)化為數(shù)組
js中的偽數(shù)組(例如通過document.getElementsByTagName或者document.querySelectorAll獲取的元素)具有l(wèi)ength屬性,并且可以通過0、1、2…下標(biāo)來訪問其中的元素,但是沒有Array中的push、pop等方法。我們可以利用call、apply來將其轉(zhuǎn)化為真正的數(shù)組這樣便可以方便地使用數(shù)組方法了。
var arrayLike = { 0: "shifeng", 1: "xingyun", 2: "ruxue", length: 3 }
上面就是一個(gè)普通的對象字面量,怎么把它變成一個(gè)數(shù)組呢?最簡單的方法就是
var arr = Array.prototype.slice.call(arrayLike)
上面arr便是一個(gè)包含arrayLike元素的真正的數(shù)組啦(注意數(shù)據(jù)結(jié)構(gòu)必須是以數(shù)字為下標(biāo)而且一定要有l(wèi)ength屬性)
數(shù)組追加
在js中要往數(shù)組中添加元素, 可以直接用push方法
var arr1 = [1,2,3] var arr2 = [4,5,6] // Array.prototype.push.apply(arr1, arr2) [].push.apply(arr1, arr2) // 使用一個(gè)輔助的空數(shù)組(為了訪問非靜態(tài)方法),就是把a(bǔ)rr2利用apply的數(shù)組參數(shù)特性push到arr1中. // 這樣通過解構(gòu)可以寫成 arr1.push(...arr2), 如果需要返回一個(gè)全新的對象,還可以使用 [...arr1, ...arr2]。 // 還可以寫成var newArr = arr1.concat(arr2) // arr1 [1, 2, 3, 4, 5, 6] // arr2 [4,5,6]
判斷變量類型
對于對象型的數(shù)據(jù)類型, 我們可以借助call來得知他的具體類型, 例如數(shù)組
function isArray(obj){ return Object.prototype.toString.call(obj) == "[object Array]"; } isArray([]) // true isArray("qianlong") // false
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88011.html
摘要:前言整理中一些相似的關(guān)鍵字方法概念。于是我們修改上面的函數(shù)來驗(yàn)證它們的區(qū)別小明擼代碼擼代碼小紅小黑小剛小紅小黑擼代碼小李小謝小剛小李小謝擼代碼那么與有什么區(qū)別呢與和不同的是,綁定后不會(huì)立即執(zhí)行。通常用來處理一些并發(fā)的異步操作。 前言 整理 javascript 中一些相似的關(guān)鍵字、方法、概念。 1. var、function、let、const 命令的區(qū)別 使用var聲明的變量,其作...
摘要:方法創(chuàng)建一個(gè)新的函數(shù)當(dāng)被調(diào)用時(shí),它的關(guān)鍵字被設(shè)置為提供的值。語法簡單地看一下這些參數(shù)的含義當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的指向當(dāng)使用操作符調(diào)用綁定函數(shù)時(shí),該參數(shù)無效。結(jié)尾文章很簡短,知道怎么實(shí)現(xiàn)一個(gè)原生的就行。 前言 這是underscore.js源碼分析的第五篇,如果你對這個(gè)系列感興趣,歡迎點(diǎn)擊 underscore-analysis/ watch一下,隨時(shí)可以看到動(dòng)態(tài)...
摘要:方法創(chuàng)建一個(gè)新的函數(shù)當(dāng)被調(diào)用時(shí),它的關(guān)鍵字被設(shè)置為提供的值。語法簡單地看一下這些參數(shù)的含義當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的指向當(dāng)使用操作符調(diào)用綁定函數(shù)時(shí),該參數(shù)無效。結(jié)尾文章很簡短,知道怎么實(shí)現(xiàn)一個(gè)原生的就行。 前言 這是underscore.js源碼分析的第五篇,如果你對這個(gè)系列感興趣,歡迎點(diǎn)擊 underscore-analysis/ watch一下,隨時(shí)可以看到動(dòng)態(tài)...
摘要:構(gòu)造函數(shù)也是函數(shù),所以當(dāng)你用普通調(diào)用方式調(diào)用時(shí)這個(gè)時(shí)候相當(dāng)于給對象添加了和兩個(gè)屬性。為構(gòu)造函數(shù)指定這里報(bào)錯(cuò)了,原因是我們?nèi)チ撕瘮?shù),這里的函數(shù)不是一個(gè)構(gòu)造函數(shù)當(dāng)然解決方式也是有的。 前言 javascript中的this是啥東西?為啥我們經(jīng)常被他搞得暈頭轉(zhuǎn)向不知所以?他是惡魔?是天使 ?是怪胎?讓我們一起來揭開它那神秘的面紗。 showImg(https://segmentfault.c...
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
閱讀 3157·2023-04-25 18:22
閱讀 2390·2021-11-17 09:33
閱讀 3307·2021-10-11 10:59
閱讀 3238·2021-09-22 15:50
閱讀 2810·2021-09-10 10:50
閱讀 860·2019-08-30 15:53
閱讀 449·2019-08-29 11:21
閱讀 2909·2019-08-26 13:58