成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript 的 this 原理

瀏覽:148日期:2023-11-10 17:06:34
一、問題的由來

學(xué)懂 JavaScript 語言,一個標志就是理解下面兩種寫法,可能有不一樣的結(jié)果。

var obj = { foo: function () {}};var foo = obj.foo;// 寫法一obj.foo()// 寫法二foo()

上面代碼中,雖然obj.foo和foo指向同一個函數(shù),但是執(zhí)行結(jié)果可能不一樣。請看下面的例子。

var obj = { foo: function () { console.log(this.bar) }, bar: 1};var foo = obj.foo;var bar = 2;obj.foo() // 1foo() // 2

這種差異的原因,就在于函數(shù)體內(nèi)部使用了this關(guān)鍵字。很多教科書會告訴你,this指的是函數(shù)運行時所在的環(huán)境。對于obj.foo()來說,foo運行在obj環(huán)境,所以this指向obj;對于foo()來說,foo運行在全局環(huán)境,所以this指向全局環(huán)境。所以,兩者的運行結(jié)果不一樣。

這種解釋沒錯,但是教科書往往不告訴你,為什么會這樣?也就是說,函數(shù)的運行環(huán)境到底是怎么決定的?舉例來說,為什么obj.foo()就是在obj環(huán)境執(zhí)行,而一旦var foo = obj.foo,foo()就變成在全局環(huán)境執(zhí)行?

本文就來解釋 JavaScript 這樣處理的原理。理解了這一點,你就會徹底理解this的作用。

二、內(nèi)存的數(shù)據(jù)結(jié)構(gòu)

JavaScript 語言之所以有this的設(shè)計,跟內(nèi)存里面的數(shù)據(jù)結(jié)構(gòu)有關(guān)系。

var obj = { foo: 5 };

上面的代碼將一個對象賦值給變量obj。JavaScript 引擎會先在內(nèi)存里面,生成一個對象{ foo: 5 },然后把這個對象的內(nèi)存地址賦值給變量obj。

JavaScript 的 this 原理

也就是說,變量obj是一個地址(reference)。后面如果要讀取obj.foo,引擎先從obj拿到內(nèi)存地址,然后再從該地址讀出原始的對象,返回它的foo屬性。

原始的對象以字典結(jié)構(gòu)保存,每一個屬性名都對應(yīng)一個屬性描述對象。舉例來說,上面例子的foo屬性,實際上是以下面的形式保存的。

JavaScript 的 this 原理

{ foo: { [[value]]: 5 [[writable]]: true [[enumerable]]: true [[configurable]]: true }}

注意,foo屬性的值保存在屬性描述對象的value屬性里面。

三、函數(shù)

這樣的結(jié)構(gòu)是很清晰的,問題在于屬性的值可能是一個函數(shù)。

var obj = { foo: function () {} };

這時,引擎會將函數(shù)單獨保存在內(nèi)存中,然后再將函數(shù)的地址賦值給foo屬性的value屬性。

JavaScript 的 this 原理

{ foo: { [[value]]: 函數(shù)的地址 ... }}

由于函數(shù)是一個單獨的值,所以它可以在不同的環(huán)境(上下文)執(zhí)行。

var f = function () {};var obj = { f: f };// 單獨執(zhí)行f()// obj 環(huán)境執(zhí)行obj.f()四、環(huán)境變量

JavaScript 允許在函數(shù)體內(nèi)部,引用當前環(huán)境的其他變量。

var f = function () { console.log(x);};

上面代碼中,函數(shù)體里面使用了變量x。該變量由運行環(huán)境提供。

現(xiàn)在問題就來了,由于函數(shù)可以在不同的運行環(huán)境執(zhí)行,所以需要有一種機制,能夠在函數(shù)體內(nèi)部獲得當前的運行環(huán)境(context)。所以,this就出現(xiàn)了,它的設(shè)計目的就是在函數(shù)體內(nèi)部,指代函數(shù)當前的運行環(huán)境。

var f = function () { console.log(this.x);}

上面代碼中,函數(shù)體里面的this.x就是指當前運行環(huán)境的x。

var f = function () { console.log(this.x);}var x = 1;var obj = { f: f, x: 2,};// 單獨執(zhí)行f() // 1// obj 環(huán)境執(zhí)行obj.f() // 2

上面代碼中,函數(shù)f在全局環(huán)境執(zhí)行,this.x指向全局環(huán)境的x。

JavaScript 的 this 原理

在obj環(huán)境執(zhí)行,this.x指向obj.x。

JavaScript 的 this 原理

回到本文開頭提出的問題,obj.foo()是通過obj找到foo,所以就是在obj環(huán)境執(zhí)行。一旦var foo = obj.foo,變量foo就直接指向函數(shù)本身,所以foo()就變成在全局環(huán)境執(zhí)行。

標簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日韩三级av在线播放| 黑丝一区二区三区| 亚洲图色在线| 久久久天堂av| 成人午夜av电影| 日韩一区二区高清| 极品少妇一区二区三区精品视频 | 极品瑜伽女神91| 在线视频一区二区免费| 亚洲一区二区四区蜜桃| 国产美女诱惑一区二区| 亚洲aaa精品| 欧美色窝79yyyycom| 精品亚洲免费视频| 欧美一区二区三区男人的天堂| 国产精品一区一区| 欧美一区二区三区白人| 成人性生交大片免费看视频在线 | 中文在线资源观看网站视频免费不卡 | 一区在线免费| 中文字幕免费不卡在线| 欧美特黄视频| 国产精品毛片a∨一区二区三区| 91麻豆福利精品推荐| 久久久久国产免费免费| 91看片淫黄大片一级| 国产亚洲欧美中文| 国产综合网站| 一区二区三区欧美日| 亚洲一区二区三区欧美| 日韩影院在线观看| 欧美三区在线观看| 国产成人在线视频网址| 久久色.com| 伊甸园精品99久久久久久| 成人欧美一区二区三区1314| 在线亚洲国产精品网站| 日韩—二三区免费观看av| 欧美久久一区二区| 99久久婷婷国产精品综合| 国产日韩欧美精品在线| 在线精品一区二区| 调教+趴+乳夹+国产+精品| 欧美色男人天堂| 成人av免费在线观看| 国产精品人人做人人爽人人添| 99re66热这里只有精品4| 亚洲不卡一区二区三区| 欧美性做爰猛烈叫床潮| 丰满白嫩尤物一区二区| 国产精品成人网| 久久久久久一区二区| 国产一区二区不卡老阿姨| 久久人人爽爽爽人久久久| 精品二区视频| 亚瑟在线精品视频| 91精品国模一区二区三区| 欧美日本一区二区高清播放视频| 一区二区三区产品免费精品久久75| 欧美综合色免费| 99久久综合色| 亚洲三级在线看| 欧美在线一二三| 91偷拍与自偷拍精品| 亚洲一区二区av在线| 欧美猛男超大videosgay| 女主播福利一区| 亚洲国产一区在线观看| 欧美视频中文一区二区三区在线观看| 成人国产一区二区三区精品| 国产精品传媒入口麻豆| 91久久线看在观草草青青| 成人精品国产一区二区4080| 亚洲欧美激情视频在线观看一区二区三区 | 久久精品国产色蜜蜜麻豆| 精品国产乱码久久久久久牛牛 | 日韩欧美国产不卡| 伊人激情综合| 天堂一区二区在线| 日韩精品一区二区三区三区免费| 亚洲黄色成人久久久| 激情成人午夜视频| 中文字幕第一区二区| 91黄色免费观看| 欧美一区1区三区3区公司| 五月天丁香久久| 精品国产欧美一区二区| 麻豆久久婷婷| 欧美成人国产| 美女精品一区二区| 国产亚洲人成网站| 欧美在线一区二区三区| 国模精品娜娜一二三区| 奇米777欧美一区二区| 精品国内二区三区| 亚洲一区二区在线免费观看| 成人免费视频视频在线观看免费| 亚洲区小说区图片区qvod| 51久久夜色精品国产麻豆| 亚洲青涩在线| 成人小视频免费在线观看| 亚洲一区二区三区精品在线| 亚洲精品在线免费播放| 乱码第一页成人| 99re视频这里只有精品| 五月激情综合婷婷| 欧美激情综合在线| 欧美美女喷水视频| 精品动漫av| 丁香五精品蜜臀久久久久99网站| 亚洲国产精品综合小说图片区| 成人一区二区在线观看| 视频一区二区中文字幕| 国产欧美精品一区二区色综合 | 久久99国产精品久久99果冻传媒| 国产精品区一区二区三| 欧美自拍丝袜亚洲| 亚洲激情在线| av福利精品导航| 久久www免费人成看片高清| 中文字幕人成不卡一区| 日韩精品一区国产麻豆| 色哦色哦哦色天天综合| 亚洲二区三区四区| 91尤物视频在线观看| 老司机精品视频导航| 在线欧美日韩国产| 日韩一级大片| 国产精品s色| 99综合电影在线视频| 国产在线视频一区二区| 亚洲成人免费视频| 综合色天天鬼久久鬼色| 久久午夜电影网| 91精选在线观看| 在线日韩一区二区| 国产精品一区亚洲| 黄色成人av网站| 91理论电影在线观看| 国产精品 欧美精品| 秋霞国产午夜精品免费视频| 一二三区精品福利视频| 国产精品国产三级国产三级人妇 | 亚洲日本在线a| 久久婷婷综合激情| 91精品视频网| 欧美三级三级三级爽爽爽| 亚洲欧美日韩国产| 日韩视频一区| 激情综合中文娱乐网| 欧美成人精品| 91女厕偷拍女厕偷拍高清| 国产成人免费在线观看不卡| 日韩电影在线观看一区| 亚洲影院免费观看| 亚洲美腿欧美偷拍| 国产精品久久久久一区| 久久久久久久一区| 精品美女在线播放| 日韩欧美一级片| 欧美另类变人与禽xxxxx| 欧美视频在线不卡| 欧美性色欧美a在线播放| 久久婷婷亚洲| 久久久久久网| 久久天天综合| 一本到高清视频免费精品| 亚洲一区二区三区在线观看视频| 99热免费精品| 1024日韩| 亚洲激情一区二区| 99精品视频免费观看视频| 极品av少妇一区二区| 亚洲一级黄色| 狠狠色狠狠色综合日日tαg| 欧美久久成人| 你懂的国产精品永久在线| 午夜精彩国产免费不卡不顿大片| 99re成人精品视频| 99久久综合国产精品| 91在线无精精品入口| 91在线观看视频| 欧美激情综合| 亚洲一级电影| 国产欧美日韩综合一区在线观看| 一二三区精品| 国产日韩精品久久| 99日韩精品| 国产欧美日韩伦理| 欧美区国产区| 欧美日韩精品免费看| 亚洲精品三级| 乱码第一页成人| 老司机午夜精品视频| 欧洲在线/亚洲| 欧美精品在欧美一区二区少妇| 69av一区二区三区| 欧美精品一区二区精品网| 国产精品情趣视频| 亚洲一区二区在线视频|