摘要:奔著一星期徹底弄清楚一個(gè)小知識(shí)點(diǎn)的目的這次的目標(biāo)是方法在實(shí)際項(xiàng)目中經(jīng)常會(huì)用到這三個(gè)函數(shù)只是簡(jiǎn)單的知道都是用來進(jìn)行上下文綁定的這三個(gè)函數(shù)都可以實(shí)現(xiàn)現(xiàn)在看來這三者還是有很大區(qū)別的特別是和其他兩個(gè)的區(qū)別先說和目的是改變函數(shù)的執(zhí)行上下文下面列舉一些
奔著一星期徹底弄清楚一個(gè)javascript小知識(shí)點(diǎn)的目的,這次的目標(biāo)是call apply bind方法
在實(shí)際項(xiàng)目中,經(jīng)常會(huì)用到這三個(gè)函數(shù),只是簡(jiǎn)單的知道,都是用來進(jìn)行上下文綁定的,這三個(gè)函數(shù)都可以實(shí)現(xiàn),現(xiàn)在看來這三者還是有很大區(qū)別的,特別是bind和其他兩個(gè)的區(qū)別
先說call和apply 目的是改變函數(shù)的執(zhí)行上下文,下面列舉一些他們的用法
實(shí)例一
const zhangsan = { name: "張三", age: 18 } const lisi = { name: "李四", age: 16 } function introduce(grade) { console.log(`我的名字叫${this.name},我今年${this.age}歲了,上${grade}了`) } introduce.call(zhangsan, 3) // 我的名字叫張三,我今年18歲了,上3了 introduce.call(lisi, 4) // 我的名字叫李四,我今年18歲了,上3了 introduce.apply(zhangsan, [3])// 我的名字叫張三,我今年18歲了,上3了 introduce.apply(lisi, [4]) // 我的名字叫李四,我今年18歲了,上3了
實(shí)例二
const People = { name: "黨", age: 100, introduce: function(grade) { console.log(`我的名字叫${this.name},我今年${this.age}歲了,上${grade}了`) } } People.introduce("大學(xué)") // 我的名字叫黨,我今年100歲了,上大學(xué)了 const zhangsan = { name: "張三", age: 18 } People.introduce.call(zhangsan, 3) // 我的名字叫張三,我今年18歲了,上3了 People.introduce.apply(zhangsan, [3]) // 我的名字叫張三,我今年18歲了,上3了
通過以上兩個(gè)例子,可以看出,call和apply的區(qū)別主要在于傳遞參數(shù)的上的不同,
他們倆的第一個(gè)參數(shù)都是要執(zhí)行環(huán)境的this, 也就是說執(zhí)行函數(shù)的上下文
第二個(gè)參數(shù)apply是以數(shù)組的方式以此傳遞, call要一個(gè)一個(gè)傳
需要注意的一點(diǎn),他們的第二個(gè)參數(shù)都可以穿arguments
下面就看下bind函數(shù)的具體用法
還是老樣子,列舉一些例子,例子更能直觀的感受其用法
還是以上面代碼為基礎(chǔ)
const wangwu = { name: "王五", age: 20 } People.introduce.bind(wangwu, 4) // ? (grade) { // console.log(`我的名字叫${this.name},我今年 // ${this.age}歲了,上 // } 可以看到輸出的是一個(gè)函數(shù)體
所以, bind后函數(shù)不會(huì)執(zhí)行, 只是返回一個(gè)改變上下文的函數(shù)副本, 而call和apply是直接執(zhí)行的函數(shù)
如果想得到和call apply一樣的效果,需要手動(dòng)執(zhí)行下改函數(shù)
People.introduce.bind(wangwu, 4)() // 我的名字叫王五,我今年20歲了,上4了
查了下bind在ie6 ~ ie8下bind的兼容性不好,如果需要兼容ie低版本瀏覽器的,需要模擬其用法
代碼如下
if(!function(){}.bind) { Function.prototype.bind = function(context) { const self = this const args = Array.prototype.slice.call(arguments) return function() { return self.apply(context, args.slice(1)) } } }
細(xì)想下來,上面這段代碼的知識(shí)點(diǎn)特別多
const self = this
通過上面兩個(gè)截圖可以很明確的知道需要讓this保存調(diào)用它的值
需要擴(kuò)展方法的時(shí)候,都需要先判斷是否已經(jīng)存在,如果不存在則會(huì)在原型prototype上添加方法
將偽數(shù)組轉(zhuǎn)化為真正的數(shù)組 Array.protoype.slice.call(arguments)
數(shù)組slice的用法,具體怎么使用可以參考這個(gè)
返回一個(gè)函數(shù),把該函數(shù)傳遞給bind的第一個(gè)參數(shù)當(dāng)做執(zhí)行上下文, 由于args已經(jīng)是一個(gè)數(shù)組,排除第一項(xiàng),之后的參數(shù)作為第二部分參數(shù)傳給apply。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95477.html
摘要:輸出的作用與和一樣,都是可以改變函數(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è)方法...
摘要:不能應(yīng)用下的等方法。首先我們可以通過給目標(biāo)函數(shù)指定作用域來簡(jiǎn)單實(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 都是...
摘要:應(yīng)用場(chǎng)景求數(shù)組中的最大值和最小值并不是最佳選擇是中的靜態(tài)方法,因此必然是沒有使用上下文的必要的。因此綁定只需要用或者占位就可以了。 前言 面試,幾乎每次都會(huì)問到一個(gè)js中關(guān)于call、apply、bind的問題,比如… 怎么利用call、apply來求一個(gè)數(shù)組中最大或者最小值 如何利用call、apply來做繼承 apply、call、bind的區(qū)別和主要應(yīng)用場(chǎng)景 作用 首先問個(gè)問...
摘要:參考鏈接在中,和是對(duì)象自帶的三個(gè)方法,都是為了改變函數(shù)體內(nèi)部的指向。返回值是函數(shù)方法不會(huì)立即執(zhí)行,而是返回一個(gè)改變了上下文后的函數(shù)。而原函數(shù)中的并沒有被改變,依舊指向全局對(duì)象。原因是,在中,多次是無效的。 參考鏈接:https://juejin.im/post/59bfe8... 在JavaScript中,call、apply和bind是Function對(duì)象自帶的三個(gè)方法,都是為了改變...
摘要:返回值這段在下方應(yīng)用中有詳細(xì)的示例解析?;卣{(diào)函數(shù)丟失的解決方案綁定回調(diào)函數(shù)的指向這是典型的應(yīng)用場(chǎng)景綁定指向,用做回調(diào)函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019971331?w=1024&h=680); 函數(shù)原型鏈中的 apply,call 和 bind 方法是 JavaScript 中相當(dāng)重要的概念,與 this...
閱讀 3421·2021-11-24 09:38
閱讀 3197·2021-11-22 09:34
閱讀 2112·2021-09-22 16:03
閱讀 2373·2019-08-29 18:37
閱讀 383·2019-08-29 16:15
閱讀 1774·2019-08-26 13:56
閱讀 867·2019-08-26 12:21
閱讀 2208·2019-08-26 12:15