日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript之模拟call以及apply实现

發布時間:2025/3/21 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript之模拟call以及apply实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

call

使用一個指定的上下文對象和若干個指定的參數值的前提下調用某個函數或方法。如果傳入null, 則this指向window

  • 注意兩點:

  • 改變方法內部的this指向
  • 執行方法
    • 實現步驟一

  • 將函數設為對象的方法
  • 執行該方法
  • 刪除該方法
  • Function.prototype.myCall = function(context) {context.fn = this // this代表sayValue方法context.fn() // 執行sayValue方法delete context.fn // 刪除對象上的方法 }var obj = {value: 'hello javascript' }function sayValue() {console.log(this.value) }sayValue.myCall(obj)復制代碼
    • 實現步驟二 (傳入參數)

  • 通過函數的arguments對象,來獲取不定參數
  • Function.prototype.myCall = function (ctx) {ctx.fn = this// 將arguments轉化成數組,通過slice()方法截取數組除第一項以外的所有項,并返回截取的數組var newArr = Array.prototype.slice.call(arguments, 1)ctx.fn(...newArr) // ES6中的 '...' 展開運算符,可以展開數組delete ctx.fn } var obj = {value: 'hello, obj' } function saySth(name, age) {console.log('name: ', name)console.log('age: ', age)console.log('obj.value: ', this.value) }saySth.myCall(obj, 'alex.cheng', 18)// 運行試試 ! 復制代碼
    • 實現步驟三

  • 函數的返回值,看以下栗子:
  • var obj = {} obj.value = 'alex.cheng' function bar() {return {value: this.value} } bar.call(obj)>>> {value: "alex.cheng"} 復制代碼
  • 最終實現
  • Function.prototype.myCall = function (ctx) {var ctx = ctx || window // 如果傳入的ctx是null的話,就將ctx指向windowctx.fn = this// 將arguments轉化成數組,通過slice()方法截取數組除第一項以外的所有項,并返回截取的數組var newArr = Array.prototype.slice.call(arguments, 1)var result = ctx.fn(...newArr) // ES6中的 '...' 展開運算符,可以展開數組delete ctx.fnreturn result // 返回ctx.fn的返回值 }var value = 'hey, this is a global_value .' // 定義一個全局變量var obj = {value: 'hello, obj.value' } function saySth(name, age) {return {name,age,value: this.value} }saySth.myCall(obj, 'alex.cheng', 18) // 傳入obj,saySth函數的this指向obj >>> {name: "alex.cheng", age: 18, value: "hello, obj.value"}saySth.myCall(null, 'alex.cheng', 18) // 傳入null,saySth函數的this指向window {name: "haolun", age: 18, value: "hey, this is a global_value ."}// 自己動手試一試 @.@ 復制代碼

    apply

    apply的用法和call的用法一樣,唯一的區別,就是傳入的參數不同,apply需要傳入數組,例如 fn.apply( null, [ ] )

  • 模擬實現也和call 相似,實現如下 :
  • Function.prototype.myApply = function (ctx) {var ctx = ctx || windowctx.fn = thisvar resultvar args = arguments[1] // 獲取傳入的數組if (!args) { // 如果沒有傳入數組參數,則直接調用ctx.fn方法result = ctx.fn()} else {result = ctx.fn(...args) // 如果傳入了數組參數,將數組參數采用ES6的'...'擴展運算符將其展開并傳入ctx.fn方法}delete ctx.fnreturn result }// 親自試一試 :) Math.max.myApply(null, [1,2,3,4,55,44,33,22,11]) 復制代碼

    總結

    以上是生活随笔為你收集整理的javascript之模拟call以及apply实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久草影视在线观看 | 久久久久亚洲av成人网人人软件 | 久久久精品久久久久 | 国产丝袜美女 | 亚洲性久久久 | 亚洲麻豆精品 | 色偷偷在线观看 | 欧美一级片一区 | 国产91精品久久久 | 亚洲国产电影在线观看 | 超级砰砰砰97免费观看最新一期 | 强行挺进白丝老师翘臀网站 | 色综合色综合色综合 | 综合xx网| 亚洲第一a| 自拍偷拍精品视频 | 亚洲天堂少妇 | 精品免费在线 | 亚洲影院在线播放 | 久久影视中文字幕 | 国产午夜精品一区二区理论影院 | 中文字幕+乱码+中文乱 | 五号特工组之偷天换月 | 天堂一区二区三区 | 青青草综合视频 | 欧美黑人精品一区二区 | 国产精品久久久免费视频 | 日本女人毛茸茸 | 日本人妻伦在线中文字幕 | 插插射射 | 就去吻综合| 日本学生初尝黑人巨免费视频 | av免费播放网站 | 国产美女精品视频 | 特一级黄色 | 乱lun合集小可的奶水 | 日韩毛片大全 | 国产福利在线视频 | 插骚| 卡通动漫亚洲综合 | 在线免费观看不卡av | 国产高清无密码一区二区三区 | 风流少妇 | 久久女| 日日综合网 | 亚洲人xxx日本人18 | 亚洲第一综合色 | 免费污视频 | 国产天堂一区 | 一二三av | 97精品超碰一区二区三区 | 岛国片免费在线观看 | 波多野在线播放 | 少妇天堂网| www.国产视频.com | 一区二区手机在线 | 日韩欧美小视频 | 国产人妖一区二区 | 欧美三级影院 | 日韩欧美在线观看一区 | 欧美激情动态图 | 欧美人成在线 | 开心黄色网 | 另类小说色 | 91久久 | 日韩av高清无码 | 中文字幕超清在线免费观看 | 欧美成人精品一区二区男人小说 | 超碰97免费 | 男女av网站 | 91久久精品国产91性色69 | 男人的网站在线观看 | 日韩欧美精品在线播放 | 三上悠亚在线一区 | 九色影视 | 免费啪| 国产黄色在线播放 | 俄罗斯黄色大片 | 日韩精品中文字幕在线 | 国产日韩视频 | 国产日韩一区二区在线观看 | 91黄漫| 国产色网址 | 欧美一区二区三区在线观看视频 | 国产精品久久久久蜜臀 | 一区二区日韩 | 日本中文字幕第一页 | 国产精品性 | 一区二区欧美日韩 | 四季av综合网站 | 国产做受高潮 | 久久国产色av免费观看 | 日韩成人av网站 | 成人在线免费电影 | 97超碰在线免费 | 最新av不卡 | 亚洲另类网站 | 久草在在线视频 | 午夜一区二区三区在线观看 |