精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

函數中的 this 不止有 72 變

開發 前端
在課程 連接你、我、他 —— this 中我們學習了 this,最后留了一個問題,如何修改 this 的指向,今天一起學習。

在課程 連接你、我、他 —— this 中我們學習了 this,最后留了一個問題,如何修改 this 的指向,今天一起學習。

修改 this 的指向可通過 apply、call、bind 這三個函數中的任意一個實現。那這三個函數是誰的方法呢?

在 MDN 中我查到了:

這張圖說明了這 3 個函數是 Function prototype 的方法,也就是說「每個函數都有著三個方法」。當定義一個函數,這個函數默認包含這三個方法。

我們感受一下 Vue.js 中關于 apply、call 和 bind 的使用:

apply 的應用:

  1. function once (fn) { 
  2.   var called = false
  3.   return function () { 
  4.     if (!called) { 
  5.       called = true
  6.       fn.apply(this, arguments); 
  7.     } 
  8.   } 

call 的應用:

  1. var hasOwnProperty = Object.prototype.hasOwnProperty; 
  2. function hasOwn (obj, key) { 
  3.   return hasOwnProperty.call(obj, key) 

bind的應用:

  1. function polyfillBind (fn, ctx) { 
  2.   function boundFn (a) { 
  3.     var l = arguments.length; 
  4.     return l 
  5.       ? l > 1 
  6.         ? fn.apply(ctx, arguments) 
  7.         : fn.call(ctx, a) 
  8.       : fn.call(ctx) 
  9.   } 
  10.  
  11.   boundFn._length = fn.length; 
  12.   return boundFn 
  13.  
  14. function nativeBind (fn, ctx) { 
  15.   return fn.bind(ctx) 
  16.  
  17. var bind = Function.prototype.bind 
  18.   ? nativeBind 
  19.   : polyfillBind; 

你可能看不懂上面的用法,下面我們一一拋開謎底。

當一個新事物的出現,總是有目的的,那么 apply、call 和 bind 的出現是為了解決什么問題呢?它們為什么是函數的方法呢?為什么不是其它對象的方法。

通過 apply、call 可以自定義 this 調用某個函數,比如定義一個全局函數(嚴格模式):

  1. 'use strict'; 
  2. function gFun(name, age) { 
  3.     console.log(this); 

這個函數可以通過下面 5 種方式調用,也就是說通過 apply、call、bind 可以調用一個函數 F,其中「函數 F 執行上下文中的 this 可以在調用時指定」:

1.直接調用:

  1. gFun('suyan', 20); // this 為 undefined 

2.通過 this 調用:

  1. this.gFun('suyan', 20); // this 為 window 

3.通過 apply 調用,把所有的參數組合成一個數組作為 apply 的參數:

  1. gFun.apply(this, ['suyan', 20]); // this 為 window 

4.通過 call 調用,參數通過逗號分割,這是與 apply 調用的區別:

  1. gFun.call(this, 'suyan', 20);  // this 為 window 

5.通過 bind 調用,會返回一個原函數的拷貝,并擁有指定的 this和參數:

  1. let bGFun = gFun.bind(this, 'suyan', 20); 
  2. bGFun();  // this 為 window 

我們一起看一些例子:

例1、setTimeOut 的使用:

  1. const time = { 
  2.     second: 1, 
  3.     afterOneSecond() { 
  4.         setTimeout(function () { 
  5.             this.second += 1; 
  6.             console.log(this.second); 
  7.         }, 1000); 
  8.     } 
  9. }; 
  10. time.afterOneSecond(); 

上面這段代碼執行后,第 6 行代碼的打印結果是 NaN,在連接你、我、他 —— this 這節課程中我們有提到過 this 設計的一個弊端是不能繼承。其實可以通過 bind 改造一下這個函數:

  1. const time = { 
  2.     second: 1, 
  3.     afterOneSecond() { 
  4.         setTimeout(this.timeInvoke.bind(this), 1000); 
  5.     }, 
  6.     timeInvoke() { 
  7.         this.second += 1; 
  8.         console.log(this.second); 
  9.     } 
  10. }; 
  11. time.afterOneSecond(); 

函數 timeInvoke 通過 bind 綁定 this,并返回一個新的函數,執行結果為 2。bind 好像具有「暫存」的功能,把當前的 this 暫存起來。

例 2、函數調用

  1. const person = { 
  2.     name: 'suyan', 
  3.     age: 20, 
  4.     showName(pre) { 
  5.         return pre + '-' + this.name; 
  6.     }, 
  7.     update(name, age) { 
  8.         this.name = name; 
  9.         this.age = age; 
  10.     } 
  11. }; 
  12.  
  13. function generateName(fun) { 
  14.     let name = fun(); 
  15.     console.log('showName = ', name); 
  16.  
  17. generateName(person.showName); 

執行上面代碼會報錯,因為 showName 中的 this 為 undefined:

可以通過 bind 「暫存 this」:

  1. const person = { 
  2.     name: 'suyan', 
  3.     age: 20, 
  4.     showName(pre) { 
  5.         return pre + '-' + this.name; 
  6.     }, 
  7.     update(name, age) { 
  8.         this.name = name; 
  9.         this.age = age; 
  10.     } 
  11. }; 
  12.  
  13. function generateName(fun) { 
  14.     let name = fun(); 
  15.     console.log('showName = ', name); 
  16. // 指定 this 為 person 對象 
  17. let bindShowName = person.showName.bind(person, '前端小課'); 
  18. generateName(bindShowName); 

例 3、構造函數,通過 call 來調用某個函數,替換 this。

  1. function Product(name, price) { 
  2.     this.name = name; 
  3.     this.price = price; 
  4.  
  5. function Food(name, price) { 
  6.     // 調用 Product 函數 
  7.     Product.call(this, name, price); 
  8.     this.catagory = 'food'
  9. let food = new Food('包子', 1); 
  10. console.log(food.name); // 包子  

例 4、調用匿名函數

  1. const animals = [ 
  2.     { 
  3.         name: 'King' 
  4.     }, 
  5.     { 
  6.         name: 'Fail' 
  7.     } 
  8. ]; 
  9.  
  10. for (let i = 0; i < animals.length; i++) { 
  11.     (function (i) { 
  12.         // 可以直接使用 this 
  13.         this.print = function () { 
  14.             console.log('#' + i + ' ' + this.name); 
  15.         }; 
  16.         this.print(); 
  17.     }).call(animals[i], i); 

結果為:

回頭再看看課程開始之前 Vue 中關于 apply、call 和 bind 的應用,是不是能看懂了?

 

責任編輯:趙寧寧 來源: 素燕
相關推薦

2010-08-24 10:12:45

2014-01-21 09:29:45

國產操作系統操作系統

2009-08-03 18:24:28

C# 4.0協變和逆變

2020-03-20 19:10:37

支付寶新版移動應用

2010-04-23 19:54:16

2018-04-17 12:28:33

iOS 11.4蘋果ClassKit

2015-08-17 11:30:51

2010-09-09 11:17:44

SQL函數公歷

2015-09-10 04:42:10

iPone蘋果發布會

2010-04-23 15:40:26

72ub手機費

2020-06-23 15:00:45

AI人工智能遠程辦公

2011-01-14 10:27:18

C#.netasp.net

2015-02-02 10:03:50

2021-04-16 15:17:19

Windows 10Windows操作系統

2024-02-22 12:18:16

Python函數用法

2019-11-25 14:06:44

AI無人駕駛自動駕駛

2022-04-18 20:12:03

TypeScript靜態類型JavaScrip

2019-03-11 09:00:00

安全工具病毒軟件惡意軟件
點贊
收藏

51CTO技術棧公眾號

国产乱妇乱子在线播视频播放网站| 国产精品欧美激情在线| 狠狠综合久久av一区二区蜜桃| 91福利视频久久久久| 一级日韩一区在线观看| 午夜免费福利视频| 久久中文欧美| 欧美成年人视频| 爱爱免费小视频| 99久久久成人国产精品| 富二代精品短视频| 中文字幕日韩一区二区三区| 欧洲精品久久一区二区| 美女脱光内衣内裤视频久久网站| 欧美另类暴力丝袜| 精品无码在线观看| 国产成人高清精品免费5388| 欧美色精品在线视频| 东北少妇不带套对白| 在线观看a视频| av高清久久久| 91香蕉电影院| 中文字幕永久在线| 亚洲区国产区| 欧美超级免费视 在线| 婷婷色一区二区三区| www.豆豆成人网.com| 欧美日韩一区二区三区在线看| 久久综合久久网| 精品美女在线观看视频在线观看| 91色视频在线| 岛国一区二区三区高清视频| 亚洲视频久久久| 欧美专区18| 午夜精品久久久久久久男人的天堂 | 欧美三级电影在线| 正在播放亚洲一区| 国产一级片自拍| 日韩久久一区二区三区| 精品人伦一区二区三区蜜桃免费| 无码人妻aⅴ一区二区三区日本| 国产精品一区二区三区四区色| 99久久99久久精品国产片果冻| 999在线免费观看视频| 91影院在线播放| 蜜臀久久久99精品久久久久久| 青青草成人在线| 青青国产在线观看| 日韩天堂av| 97国产在线视频| 日本视频免费在线| 亚洲精选一区| 2021国产精品视频| 日韩在线视频免费播放| 国产视频亚洲| 欧美中文字幕视频在线观看| 日韩精品在线免费视频| 日韩一级欧洲| 欧美一级淫片丝袜脚交| av大全在线观看| 石原莉奈在线亚洲三区| 国产97在线|亚洲| 奴色虐av一区二区三区| 日韩福利视频导航| 国产精品欧美日韩一区二区| 中文字幕第一页在线播放| 日韩电影一区二区三区四区| 国产精品极品在线| 91久久久久久久久久久久| 久久91精品国产91久久小草| 成人精品久久av网站| 99久久久久成人国产免费| 国产精品夜夜爽| 国产精品一区二区三区在线| 亚洲人成色777777精品音频| 久久久久久久久久久黄色| 日韩色妇久久av| 毛片在线播放a| 亚洲亚洲人成综合网络| 成 年 人 黄 色 大 片大 全| 天堂中文最新版在线中文| 欧洲精品中文字幕| 熟妇无码乱子成人精品| 风间由美性色一区二区三区四区 | 久久精品国产亚洲a∨麻豆| 国产片一区二区三区| 中文字幕av日韩精品| 少妇av在线| 一本大道av一区二区在线播放| 69久久久久久| 亚洲欧洲国产精品一区| 亚洲精品日韩在线| 成人三级视频在线观看| 亚洲精品字幕| 成人午夜一级二级三级| 天天干天天做天天操| 国产精品美女久久福利网站| 日韩精品一区二区三区四| 羞羞影院欧美| 日韩一区二区免费在线电影| 国产熟妇搡bbbb搡bbbb| 中文精品电影| 国产成人精品一区二区三区| 精品国产乱码一区二区三 | 日韩电影免费在线| 丁香婷婷久久久综合精品国产| 韩日在线视频| 亚洲国产精品一区二区尤物区| 免费激情视频在线观看| 91麻豆精品激情在线观看最新| 国产亚洲精品久久久优势| 久久久久成人网站| 久久精品国产亚洲a| 九九九九久久久久| 3d玉蒲团在线观看| 欧美日韩和欧美的一区二区| 亚洲欧美日本一区| 亚洲精品888| 国产精品美女网站| 性感美女福利视频| 亚洲一区二区黄色| 999久久久精品视频| 国产精品午夜一区二区三区| 久久久久久网址| 国产欧美久久久精品免费| 久久精品视频网| 波多野结衣之无限发射| 91久久精品无嫩草影院| 久久九九热免费视频| 日韩国产成人在线| 久久只精品国产| 成人免费aaa| 国产福利资源一区| 色综合久综合久久综合久鬼88| 91精品中文字幕| 日本一区二区久久| 9久久婷婷国产综合精品性色| 日韩在线影视| 国产91精品不卡视频| 色网站免费观看| 午夜精品国产更新| 国产免费一区二区三区最新6| 午夜精品久久| 波多野结衣成人在线| 日本三级在线观看网站| 日韩一区二区三区在线| 国产又黄又爽又无遮挡| 国产精品一区二区久久不卡| 91麻豆天美传媒在线| 91精品麻豆| 久久在精品线影院精品国产| 国产精品无码白浆高潮| 综合久久综合久久| 国产精品嫩草影视| 午夜日韩福利| 国产伦精品一区二区三区照片| 欧美1—12sexvideos| 欧美不卡视频一区| 97人人澡人人爽人人模亚洲 | 欧美日韩激情在线| 欧美h片在线观看| 国产综合一区二区| 黄色录像特级片| 日韩成人在线观看视频| 久久久久久69| 天堂a√中文在线| 一本色道综合亚洲| 无码人中文字幕| 国产一区二区三区蝌蚪| 男人天堂手机在线视频| 日韩成人av在线资源| 国产97色在线|日韩| 日韩在线资源| 精品欧美久久久| 久久久精品免费看| 国产精品久久久久久亚洲毛片| 在线免费看v片| 在线成人国产| 日韩精品久久一区二区三区| 91麻豆精品国产91久久久更新资源速度超快| 日韩视频免费大全中文字幕| 朝桐光av在线一区二区三区| 精品久久久久久久中文字幕| 日韩视频在线观看免费视频| 国产又黄又大久久| 一区二区传媒有限公司| 成人激情诱惑| 国产高清精品一区二区| 亚洲mmav| 欧美激情视频网站| 国产美女性感在线观看懂色av| 91精品国产丝袜白色高跟鞋| 天堂网一区二区三区| 中文幕一区二区三区久久蜜桃| 国产在线观看免费播放| 快she精品国产999| 天天想你在线观看完整版电影免费| 免费成人三级| 国产日产久久高清欧美一区| 激情aⅴ欧美一区二区欲海潮| 色妞欧美日韩在线| 四虎精品一区二区三区| 欧美日韩高清一区二区不卡| 日本一区二区不卡在线| 日韩毛片视频在线看| 变态另类丨国产精品| 精品一区二区免费在线观看| 欧美亚洲国产成人| 91精品国产乱码久久久久久久| 欧美不卡1区2区3区| 欧美a级大片在线| 国产精品高精视频免费| 黄色污网站在线观看| 欧美成人午夜激情视频| 69视频在线观看| 国产视频综合在线| 性做久久久久久久久久| 欧美日韩成人综合在线一区二区 | 欧美性欧美巨大黑白大战| 日本中文字幕免费观看| 亚洲人吸女人奶水| 色噜噜噜噜噜噜| 97成人超碰视| 中文字幕人妻一区二区三区| 国产乱码精品一区二区三区av| 亚洲第一中文av| 久久亚洲一区| av在线免费观看国产| 91成人超碰| 国产对白在线播放| 四虎8848精品成人免费网站| 欧美日韩亚洲在线| 欧洲vs亚洲vs国产| 国产亚洲精品自在久久| av成人综合| 97免费资源站| 欧美9999| av观看久久| 成人av动漫| 国产三级精品在线不卡| 国产成人aa在线观看网站站| 国产精品美女诱惑| 91精品国产自产精品男人的天堂| 97影院在线午夜| 亚洲三级av| 国产高清自拍一区| 波多野结衣在线一区二区| 高清视频在线观看一区| www.豆豆成人网.com| 国产欧美亚洲日本| 日韩动漫一区| 蜜桃导航-精品导航| 亚洲黄页网站| 日韩hmxxxx| 日韩在线第七页| 正在播放91九色| 91精品国产乱码久久久久久| 可以在线看黄的网站| 午夜精品久久| 少妇人妻在线视频| 丝袜美腿亚洲色图| 免费看涩涩视频| 国产在线精品视频| 麻豆短视频在线观看| av在线不卡电影| 久久久久亚洲av无码专区桃色| 国产欧美日韩在线看| 亚洲精品天堂网| 亚洲另类色综合网站| 国产成人精品av久久| 欧美性色视频在线| 伊人网av在线| 日韩欧美国产精品一区| 婷婷丁香花五月天| 国产亚洲精品美女久久久久| 成人短视频在线观看| 欧美激情视频三区| 日韩三区免费| www.久久艹| 欧美人与牛zoz0性行为| av不卡在线免费观看| 日韩视频免费| 日韩av在线中文| 成人久久久精品乱码一区二区三区| 99久久人妻无码中文字幕系列| 中文字幕久久午夜不卡| 中文字幕在线观看成人| 精品色蜜蜜精品视频在线观看| 探花国产精品一区二区| 日韩免费电影一区| 激情视频在线观看免费| 欧美老女人在线视频| 欧美天堂视频| 不卡视频一区二区三区| 成人久久一区| 欧美精品久久久久久久免费| 六月婷婷色综合| 毛茸茸free性熟hd| 亚洲三级电影网站| wwwwww国产| 日韩欧美国产电影| av在线播放av| 欧美在线视频在线播放完整版免费观看 | 一区不卡在线观看| 亚洲国产天堂久久综合网| 婷婷在线视频观看| 日本在线精品视频| 国产精品香蕉| 男同互操gay射视频在线看| 久久只有精品| 国产在线观看无码免费视频| 亚洲精品自拍动漫在线| 真实新婚偷拍xxxxx| 日韩av网站在线| 亚洲制服国产| 国产在线视频欧美| 国产成人调教视频在线观看 | 久久99精品久久久久久久青青日本| 91亚洲国产高清| 成人在线观看黄| www.欧美.com| 国产高潮流白浆| 欧美午夜电影一区| 免费在线黄色电影| 91av视频导航| 菁菁伊人国产精品| 真人抽搐一进一出视频| 国产一区免费电影| 精品在线观看一区| 欧美色欧美亚洲另类二区| 国产小视频在线| 欧洲中文字幕国产精品| 久久中文字幕导航| 国产免费黄色一级片| 粉嫩绯色av一区二区在线观看| 国产精品白丝喷水在线观看| 欧美色欧美亚洲另类二区| a天堂在线资源| 国产精品都在这里| 不卡在线一区| xxxx一级片| 国产精品久久一卡二卡| 在线播放成人av| 色综合伊人色综合网| 日韩久久一区| 手机福利在线视频| 国产一区二区三区免费| 印度午夜性春猛xxx交| 日韩亚洲欧美在线观看| 欧美hdxxxxx| 国产一区二区中文字幕免费看| 亚洲电影成人| 女同毛片一区二区三区| 色综合久久中文字幕综合网 | 久久艳片www.17c.com | 高清电影在线免费观看| 国产乱码精品一区二区三区不卡| 国产一区美女| 最近中文字幕无免费| 欧美性猛交xxxx免费看久久久 | 久久午夜a级毛片| 无码国模国产在线观看| 久久99中文字幕| 久久嫩草精品久久久精品一| 成人午夜精品视频| 久久伊人色综合| 国产精品极品国产中出| 男人天堂1024| 欧美极品aⅴ影院| 国产女人爽到高潮a毛片| 欧美精品18videosex性欧美| 欧美大奶一区二区| av无码精品一区二区三区| 国产精品午夜久久| av在线免费在线观看| 国产综合在线看| 国产免费久久| 国内av免费观看| 天天综合天天做天天综合| 国产一二在线观看| 91精品久久久久久蜜桃| 亚洲一区二区三区高清| 亚洲色图日韩精品| 精品播放一区二区| 91九色综合| 亚洲色成人www永久在线观看| 久久久久国产一区二区三区四区| 国产一区二区小视频| 97超碰色婷婷| 99久久99久久精品国产片桃花| 无码国产69精品久久久久网站| 91福利社在线观看| ririsao久久精品一区| 色一情一乱一伦一区二区三欧美| 国产成人精品一区二区三区四区 | 日本一区美女| 国产成人丝袜美腿| 精品乱码一区内射人妻无码| 久久久久久亚洲精品不卡| 日韩情爱电影在线观看|