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

JavaScript之深入理解this

開發 前端
在大多數情況下,this的值由函數調用方式決定,它不能在執行期間賦值來設置,它在每次執行下可能都有不同的值。

[[381978]]

 定義

this是函數運行時自動生成的內部對象,即調用函數的那個對象。(不一定很準確的定義,但還算通俗易懂) 在大多數情況下,this的值由函數調用方式決定,它不能在執行期間賦值來設置,它在每次執行下可能都有不同的值。

全局執行環境(outside function)

在全局執行環境中,this一直指向全局對象(global object),不管是在嚴格模式還是在非嚴格模式中。

代碼1 

  1. console.log(this.document === document);   //true  
  2. // 在瀏覽器中,window對象也就是全局對象(global object)  
  3. console.log(this === window);   //true  
  4. this.a  = 37 
  5. console.log(window.a);   //37 

函數執行環境(inside function)

在函數執行環境中,this的值取決于函數的調用方式。

而函數的調用方式主要有4種:

  •  函數直接調用
  •  對象方法調用
  •  構造函數調用
  •  call / apply / bind
  •  箭頭函數(ES6)

函數直接調用

下面的代碼在非嚴格模式執行時,this的值會指向全局對象;而在嚴格模式中,this的值將會默認為undefined。

代碼2 

  1. /* 非嚴格模式 */  
  2. function f1 () {  
  3.   return this;  
  4.  
  5. console.log(f1() === window);   //true  
  6. // in node;  
  7. console.log(f1() === global);   //true  
  8. /* 嚴格模式 */  
  9. function f2 () {  
  10.   'use strict'  
  11.   return this;  
  12.  
  13. console.log(f1() === undefined);   //true 

call / apply / bind 改變this的指向

call / apply

call和apply的用法很像,只是后面參數的傳入形式不同。

代碼3 

  1. function add(c, d) {  
  2.   return this.a + this.b + c + d;  
  3.  
  4. var o = {a: 1, b: 3};  
  5. // call的第一個參數 是對象,也就是this的指向對象。后面的參數就是函數arguments對象的成員  
  6. add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16  
  7. // call的第一個參數 是對象,也就是this的指向對象。后面的參數是數組,數組里的成員也就是函數arguments對象成員  
  8. add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34 

使用call和apply時需要注意的是,當傳入的第一個參數的值不是對象時,JavaScript會嘗試使用ToObject 操作將其轉化為對象。

代碼4 

  1. function bar() {  
  2.   console.log(Object.prototype.toString.call(this));  
  3.  
  4. bar.call(7); // [object Number] 

bind 方法

ECMAScript 5 引入了 Function.prototype.bind。調用f.bind(someObject)會創建一個與f具有相同函數體和作用域的函數,但是在這個新函數中,this將永久地被綁定到了bind的第一個參數,無論這個函數是如何被調用的。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

代碼5 

  1. function f() {  
  2.   return this.a;  
  3.  
  4. var g = f.bind({a: 'azerty'}); //生成一個綁定函數g  
  5. console.log(g()); // azerty  
  6. var o = {a: 10, f: f, g: g};  
  7. console.log(o.f(), o.g());   //10, azerty  
  8. //需要注意的是,綁定函數不可以再bind  
  9. var h = g.bind({a: 'foo'});  
  10. console.log(h());  //azerty,不會變成foo 

對象方法調用

當以對象里的方法的方式調用函數時,它們的 this 是調用該函數的對象.

下面的例子中,當 o.f() 被調用時,函數內的this將綁定到o對象。 

  1. var prop = 36 
  2. var o = {  
  3.   prop: 37,  
  4.   bar: function() {  
  5.     return this.prop;  
  6.   }  
  7. };  
  8. console.log(o.bar());  //37 

構造函數調用

代碼6 

  1. function Person(name, age) {  
  2.   this.name = name;  
  3.   this.age = age;  
  4.   this.introduce = function () {  
  5.     console.log('My name is ' + this.name + ', I\'m ' + this.age);  
  6.   };  
  7.  
  8. var Joseph = new Person('Joseph', 19);  
  9. Joseph.introduce();  // "My name is Joseph, I'm 19" 

由上述代碼可以清晰的看到this與被新創建的對象綁定了。

注意:當構造器返回的默認值是一個this引用的對象時,可以手動設置返回其他的對象,如果返回值不是一個對象,返回this。(這句話看起來比較難理解,我們看下一個例子)。

代碼7 

  1. function Fn2() {  
  2.   this.a = 9;  // dead code  
  3.   return {a: 10};  
  4.  
  5. var o = new Fn2(); 
  6. console.log(o.a);  // 10 

這個例子說明了當構造函數返回的是一個對象的話,此時this的值會變成此時返回的對象。‘this.a = 9’成了僵尸代碼。

箭頭函數

在箭頭函數( Arrow functions)中,this的值是封閉執行環境決定的。在全局環境中,那么被賦值為全局對象。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions 

  1. var globalObject = this 
  2. var foo = (() => this);  
  3. console.log(foo() === globalObject); // true 

更重要的是它與其他情況不同的是,不管函數如何調用,上面this的值一直都是全局對象。call / bind 也不能改變它的值。

代碼8 

  1. // 作為對象方法被調用  
  2. var obj = {foo: foo};  
  3. console.log(obj.foo() === globalObject); // true  
  4. // 嘗試用 call 改變this的值  
  5. console.log(foo.call(obj) === globalObject); // true //this的值并未變成obj  
  6. // 嘗試用 bind 改變this的值  
  7. foofoo = foo.bind(obj);  
  8. console.log(foo() === globalObject); // true 

案例

本文知識點都看完了。讓我們看幾個案例,檢查自己的掌握情況。

例1 

  1. var prop = 36 
  2. var o = {  
  3.   prop: 37,  
  4.   bar1: function() {  
  5.     function foo1() {  
  6.       return this.prop;  
  7.     }  
  8.     return foo1;  
  9.   },  
  10.   bar2: function() {  
  11.     var foo2  = (() => this.prop); //ES6箭頭函數  
  12.     return foo2;  
  13.   } 
  14. };  
  15. console.log('result1:'+o.bar1()()); // result1 ?  
  16. console.log('result2:'+o.bar2()()); // result2 ?  
  17. var fn2 = o.bar2;  
  18. console.log('result3:'+fn2()()); // result3 ? 

先揭曉答案:例1 result1 = 36,result2 = 37,result3 = 36。我的理解是,在result1中,o.bar1()執行導致foo函數return到了全局環境中,然后執行就變成了在全局中執行,所以得到的是全局中36的值。result2呢?因為this在箭頭函數中。它的值不會改變。所以this仍指向o。那為什么result3又重新變了呢?因為此時‘var fn2 = o.bar2’相當于重新定義了一個函數,而this的值當然也就變為了全局對象。 

  1. // 相當于這樣  
  2. var fn2 = function() {  
  3.     function foo1() {  
  4.       return this.prop;  
  5.     }  
  6.     return foo1;  
  7.   }  
  8. fn2()(); 

例2 

  1. function sum(a,b) {  
  2.  return a+b;  
  3. };  
  4. var o = { 
  5.   num: 1,  
  6.   fn: function() {  
  7.         function handle() {  
  8.           return this.num = sum(this.num, this.num);  
  9.         }  
  10.     handle();  
  11.   }  
  12. };  
  13. console.log('result:'+o.fn());  // result ? 

同樣先揭曉答案:result = undefined,用控制臺可以看到此時this指向window,而不是o。這是個比較容易掉進去的坑(一般認為是當初的語言設計錯誤,被人詬病不少)。看似函數是由對象方法調用的,其實細心的話,我們可以看到。handle函數的執行,前面的沒有對象的。這種情況下,this指向全局對象。解決辦法也很簡單。 

  1. // 1、取消 handle函數的定義,直接在對象的方法中使用this  
  2. fn2: function() {  
  3.     this.value = sum(this.value, this.value);  //2  
  4. },  
  5. ///2、使用變量保存外部函數的this。  
  6. fn3: function() {  
  7.     var that = this;   // that == o  
  8.     function handle() {  
  9.         that.value = add(that.value, that.value);  
  10.     }  
  11.     handle();  
  12.  

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2012-04-12 09:38:21

JavaScript

2015-11-04 09:57:18

JavaScript原型

2017-08-08 09:15:41

前端JavaScript頁面渲染

2024-07-18 10:12:04

2019-11-05 10:03:08

callback回調函數javascript

2013-11-05 13:29:04

JavaScriptreplace

2012-01-05 15:07:11

JavaScript

2012-04-12 09:33:02

JavaScript

2019-03-18 09:50:44

Nginx架構服務器

2014-12-04 14:01:54

openstacknetworkneutron

2018-12-27 12:34:42

HadoopHDFS分布式系統

2022-09-05 22:22:00

Stream操作對象

2020-07-24 10:00:00

JavaScript執行上下文前端

2020-12-16 09:47:01

JavaScript箭頭函數開發

2011-03-02 12:33:00

JavaScript

2017-03-28 21:39:41

ErrorsStack trace代碼

2017-04-25 15:30:23

堆棧函數JavaScript

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過濾器
點贊
收藏

51CTO技術棧公眾號

波多野结衣亚洲色图| 亚洲黄色av片| 成年人免费在线视频| 麻豆精品在线观看| 国内精久久久久久久久久人| 人妻少妇精品视频一区二区三区| 视频一区在线免费看| 亚洲天堂久久久久久久| 精品视频高清无人区区二区三区| 午夜一级黄色片| 欧美区一区二| 在线播放国产一区二区三区| 无码人妻丰满熟妇区毛片蜜桃精品 | 午夜亚洲精品| 粗暴蹂躏中文一区二区三区| 久久国产精品无码一级毛片| 精品一区二区三区中文字幕在线 | 中文字幕欧美三区| 国产高清不卡av| 在线观看国产精品视频| 亚洲激情午夜| 九九热这里只有精品免费看| 久久久视频6r| 日本妇女一区| 亚洲精品在线网站| 天堂视频免费看| 黄瓜视频成人app免费| 夜夜亚洲天天久久| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 神马午夜电影一区二区三区在线观看| 精品在线观看视频| 国产精品久久久久久久av电影 | 91久久视频| 欧美成人精品在线视频| www久久久久久久| 视频福利一区| 亚洲国产精品久久久久| 日本高清免费在线视频| 成人在线视频免费看| 欧美性猛交xxxx乱大交蜜桃 | 国产美女网站视频| 激情综合网站| 亚洲男子天堂网| 97香蕉碰碰人妻国产欧美 | 波多野结衣爱爱视频| av一区二区在线观看| 亚洲精品中文字幕av| 天天躁日日躁狠狠躁av麻豆男男 | 极品美妇后花庭翘臀娇吟小说| 欧美人与牛zoz0性行为| 亚洲精品天天看| 亚洲黄色在线网站| 亚洲区小说区图片区qvod| 亚洲精品一区在线观看| 乱码一区二区三区| 国产精品男女| 国产丝袜一区二区三区免费视频| 中文字幕一区三区久久女搜查官| 美国一区二区| 国产偷亚洲偷欧美偷精品| 国产黄色网址在线观看| 精品在线播放| 一夜七次郎国产精品亚洲| 欧美做受高潮6| 欧美限制电影| 久久久精品一区二区| 小嫩苞一区二区三区| 五月天综合网站| 蜜月aⅴ免费一区二区三区| 老妇女50岁三级| 亚洲精品综合| 日本韩国欧美精品大片卡二| 伦av综合一区| 久久国内精品自在自线400部| 成人黄色免费看| www.黄色小说.com| 91在线高清观看| 亚洲国产精品一区二区第一页| 黄色国产网站在线播放| 亚洲卡通动漫在线| 日本在线xxx| www.一区| 精品乱人伦小说| 无码 人妻 在线 视频| 色777狠狠狠综合伊人| 久久影院模特热| 中文字幕在线观看免费视频| 日韩高清不卡一区二区| 成人中文字幕在线观看| 丰满人妻妇伦又伦精品国产| 91看片淫黄大片一级| 亚洲国产欧美日韩| 蜜桃成人365av| 欧美亚洲图片小说| av不卡中文字幕| 欧美日韩精品一区二区视频| 欧美第一淫aaasss性| 亚洲 欧美 日韩 综合| 美女网站色91| 欧美丝袜一区二区三区| 久久久精品中文字幕| 国产精品.www| 久久国产夜色精品鲁鲁99| 国产精品视频免费观看| www.国产精品.com| 亚洲国产aⅴ成人精品无吗| 我要看一级黄色大片| 一区二区三区四区精品视频| 亚洲视频在线播放| 久久这里只有精品国产| 蜜桃精品在线观看| 久久国产手机看片| 超碰在线最新| 在线一区二区视频| 日本一级大毛片a一| 激情综合网五月| 57pao国产成人免费| 91国产精品一区| 久久亚洲精精品中文字幕早川悠里| 一区二区三区久久网| 三妻四妾的电影电视剧在线观看| 在线播放视频一区| 白丝女仆被免费网站| 欧美精品偷拍| 成人免费大片黄在线播放| 男女视频在线观看免费| 亚洲超碰精品一区二区| av在线免费看片| 日韩精品永久网址| 国产不卡视频在线| 四虎影院在线域名免费观看| 亚洲国产cao| 三级网站免费看| 亚洲一区二区三区| 成人午夜在线观看| 永久免费av在线| 欧美日韩视频在线观看一区二区三区 | 日本成人三级| 亚洲播播91| 亚洲免费电影一区| 波多野结衣视频网站| av在线不卡电影| 99精品在线免费视频| 卡通动漫精品一区二区三区| 欧美精品久久久久久久久| 精品女同一区二区三区| 亚洲欧美日韩一区二区 | 黄色片中文字幕| 久久免费看少妇高潮| 国产中文字幕免费观看| 青青草久久爱| 日韩美女激情视频| 九色蝌蚪在线| 欧美主播一区二区三区| 性猛交娇小69hd| 蜜臀久久久久久久| 黄色一级片网址| 亚洲精品黑牛一区二区三区| 欧美成人免费小视频| 农村少妇久久久久久久| 精品久久久国产| 免费观看av网站| 免费成人av在线| 无码人妻精品一区二区蜜桃百度| 高清欧美性猛交xxxx黑人猛| 午夜欧美大片免费观看| 你懂的视频在线观看| 欧美性猛交xxxxxx富婆| 国产午夜精品理论片在线| 国产福利一区二区三区视频 | gogo亚洲高清大胆美女人体| 亚洲四色影视在线观看| 一本色道久久综合亚洲| 亚洲精品日日夜夜| 国产亚洲色婷婷久久99精品91| 久久国产日本精品| 亚洲精品影院| 9l视频自拍蝌蚪9l视频成人| 国产91精品黑色丝袜高跟鞋 | 久久男人资源视频| 欧美套图亚洲一区| 欧美日韩国产首页在线观看| 欧美成人一二三区| 91麻豆精品秘密| 天天操狠狠操夜夜操| 亚洲欧美一区在线| 欧美日韩中文国产一区发布| 四虎国产精品免费久久| 韩国v欧美v日本v亚洲| 9色在线观看| 亚洲成人精品av| 中文字幕人妻互换av久久 | 一级久久久久久| 一区二区三区四区激情 | 高潮毛片7777777毛片| 色综合天天综合狠狠| 天天爽天天爽天天爽| 不卡的av网站| 免费黄频在线观看| 亚洲欧美bt| 超级碰在线观看| 精品一区不卡| 国产一区二区久久久| 深夜福利亚洲| 国产成人精品在线观看| 日韩少妇视频| 精品国产区一区二区三区在线观看| 色综合免费视频| 91麻豆精品国产自产在线 | 91黄页在线观看| 久热爱精品视频线路一| 玖玖综合伊人| 日韩国产精品视频| 亚洲av无码片一区二区三区| 欧美体内she精视频| 国产做受高潮漫动| 一区二区三区中文字幕精品精品| 久久久精品成人| 91日韩一区二区三区| 亚洲欧美激情一区二区三区| 九色综合狠狠综合久久| 黄色一级二级三级| 99热免费精品在线观看| 男人添女荫道口喷水视频| 亚洲成人免费| 在线免费观看一区二区三区| 国产区精品区| 欧美日韩国产三区| 欧美三级午夜理伦三级在线观看| 成人av免费在线看| 久久久久久久久成人| 91精品啪aⅴ在线观看国产| 91久久久久久白丝白浆欲热蜜臀| 青青草99啪国产免费| 国产高清自产拍av在线| 久久久久久国产精品久久| 影音先锋中文在线视频| 久久精品这里热有精品| 精品国产99久久久久久| 久久精视频免费在线久久完整在线看 | 日韩一级特黄| 国产日韩欧美中文| 久久夜夜久久| 成人亚洲欧美一区二区三区| 亚洲在线资源| 91九色在线观看| 盗摄系列偷拍视频精品tp| 99热国产免费| 91欧美极品| 国产精品免费一区二区三区| 黄色免费大全亚洲| 久久久久一区二区| 夜夜躁狠狠躁日日躁2021日韩| 久久久久天天天天| 你微笑时很美电视剧整集高清不卡| 欧美一区二区三区电影在线观看| 国产一区不卡| 一区在线电影| 国产综合欧美| 国产乱子夫妻xx黑人xyx真爽| 亚洲欧美成人综合| 日韩欧美黄色大片| 国产专区欧美精品| 又黄又色的网站| 91视视频在线观看入口直接观看www | 黄色片在线免费| 久久99精品久久久久婷婷| 亚洲精品国产久| 99久久精品免费| 国产黄色录像视频| 亚洲卡通欧美制服中文| 国产成年人免费视频| 色老汉一区二区三区| 国产又黄又大又粗的视频| 欧美tk—视频vk| 韩国中文字幕2020精品| 爽爽爽爽爽爽爽成人免费观看| 羞羞的网站在线观看| 91精品国产91久久久久久久久| 国精产品一区二区三区有限公司| 成人黄色午夜影院| 国产一级成人av| 色姑娘综合网| 亚洲毛片视频| 成人亚洲免费视频| 91天堂素人约啪| 亚洲一二三在线观看| 亚洲国产精品欧美一二99| 日韩精品一区不卡| 日韩一区二区影院| 免费在线黄色影片| 久久91亚洲人成电影网站| jk漫画禁漫成人入口| 91网站免费观看| 国产成人影院| 亚洲国产精品无码观看久久| 蜜桃视频在线一区| 800av在线播放| 亚洲免费观看高清完整版在线 | 欧美黄色直播| 欧美激情综合色综合啪啪| 已婚少妇美妙人妻系列| 成人一区在线观看| 一级黄色片日本| 欧洲一区二区三区免费视频| 天堂网av2014| 欧美肥臀大乳一区二区免费视频| 亚洲伦理影院| 精品国产乱码久久久久久108| 先锋资源久久| www.色偷偷.com| 99re热这里只有精品视频| 亚洲一级生活片| 欧美色精品在线视频| 性感美女一级片| 欧美黑人性猛交| 大胆国模一区二区三区| 日韩精品一区二区三区丰满| 亚洲国产精品第一区二区三区| 91丨九色丨蝌蚪| 国产精品色一区二区三区| 天天干在线播放| 亚洲韩国青草视频| 福利写真视频网站在线| 亚洲一区二区三区久久| 色男人天堂综合再现| 亚洲人成无码www久久久| 99在线热播精品免费| 精品在线视频免费| 日韩精品一区二区三区视频| 最新黄网在线观看| 亚洲一区二区三区视频| 99视频精品全部免费在线视频| 亚洲国产精品三区| 国产日产亚洲精品系列| 免费无码国产精品| 亚洲视频日韩精品| 久久电影tv| 日韩欧美精品一区二区| 日本视频中文字幕一区二区三区| 亚欧洲乱码视频| 91极品视觉盛宴| 国产大学生校花援交在线播放| 日韩美女在线播放| 久久91麻豆精品一区| 精品视频无码一区二区三区| 久久精品日产第一区二区三区高清版 | 国产一级精品aaaaa看| 亚洲美女视频在线免费观看| 午夜不卡久久精品无码免费| 欧美日韩激情视频| 日韩av资源| 国产精品欧美日韩久久| 天天影视综合| 性xxxxxxxxx| 亚洲成在人线在线播放| 午夜视频www| 国产精品96久久久久久| 日韩欧美高清在线播放| 国产福利精品一区二区三区| 亚洲精品写真福利| 日本成人动漫在线观看| 欧美一区二区三区免费观看| 成人影视亚洲图片在线| 天天干天天av| 亚洲一区二区高清| 免费国产羞羞网站视频| 欧美在线激情视频| 青青草综合网| 中文字幕久久久久久久| 午夜伊人狠狠久久| 国产在线资源| 亚洲free性xxxx护士hd| 亚洲每日更新| 人妻无码一区二区三区免费| 日韩一二在线观看| 中文在线最新版地址| 亚洲欧洲精品在线| 成人网在线免费视频| 国产污视频网站| 成人97在线观看视频| 一区二区三区日本久久久| 国产美女18xxxx免费视频| 亚洲国产欧美日韩另类综合| 国产一区二区三区福利| 亚洲综合中文字幕68页| 国产精品综合| 乱h高h女3p含苞待放| 日韩激情视频在线播放| 在线播放成人| 黄www在线观看| 亚洲色图另类专区| 免费a在线观看| 国产成人免费观看| 免费国产亚洲视频| 日韩污视频在线观看| 日韩中文字在线| 曰本一区二区三区视频| 深夜视频在线观看| 欧美日韩一区二区在线观看视频|