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