日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

深入了解JavaScript詞法作用域

瀏覽:201日期:2023-10-19 14:04:50

JavaScript并不是傳統的塊級作用域,而是函數作用域!

一、作用域

JavaScript引擎在代碼執行前會對其進行編譯,在這個過程中,像var a = 2 這樣的聲明會被分解成兩個獨立的步驟:

第一步(編譯階段):var a 在其作用域中聲明新變量。這會在最開始的階段,也就是代碼執行前進行。第二步(運行階段):a = 2 會查詢變量a(LHS查詢)并對其進行賦值。

LHS & RHS(當前作用域->上級作用域->...->全局作用域)

LHS(左側):試圖找到變量的容器本身RHS(右側):查找某個變量的值

示例:

function foo(a){var b = a;return a + b;}var c = foo(2);// LHS(3處):c;a(隱式變量分配);b;// RHS(4處):foo(2);=a;a;b; 異常

function foo(a){console.log(a + b);b = a;}foo(2);

(1)在ES5“嚴格模式”下,LHS拋出ReferenceError;“非嚴格模式”下,LHS會自動隱式的創建一個全局變量。

(2)RHS查詢在所有嵌套的作用域中遍尋不到所需遍歷會拋出ReferenceError。

(3)RHS查詢到一個變量,但你嘗試對其不合理的操作(引用null或undefined類型中的屬性),會拋出TypeError。

一句話概括之:ReferenceError同作用域判別失敗相關;而TypeError則代表作用域判別成功了,但是對結果的操作是非法或不合理的。

PS:從原理上闡述了博客中《JavaScript函數及其prototype》函數執行覆蓋等問題!!!

二、詞法作用域

詞法作用域意味著作用域是由書寫代碼時函數聲明的位置來決定的。JavaScript中有兩個機制可以“欺騙”詞法作用域:eval(...)和with。

eval

eval函數可以接受一個字符串參數,并將其中的內容視為好像在書寫時存在于程序中這個位置的代碼(在當前位置,可生成代碼,并運行)。eval可以對一段包含一個或多個聲明的“代碼”字符串進行演算,并借此修改已經存在的詞法作用域(運行階段)。

function foo(str,a){eval(str);console.log(a, b);//1 , 3console.log(a, window.b);//1 , 2}var b = 2;foo('var b = 3;', 1);

解釋:上述全局變量b被覆蓋了,由于b是全局的,可以window.b獲取到;但非全局的變量如果被覆蓋,就無法訪問到了!嚴格模式下:

function foo(str,a){'use strict';eval(str);console.log(a, b);//1 , 2console.log(a, window.b);//1 , 2}var b = 2;foo('var b = 3;', 1); with

with通常被當作重復引用一個對象中的多個屬性的快捷方式,可以不需要重復引用對象本身。with將對象的屬性當作作用域中的標識符來處理,從而創建了一個新的詞法作用域(運行階段)。

function foo(obj){with(obj){a = 2;}}var o1 = { a : 3 };var o2 = { b : 3 };foo(o1);console.log( o1.a );// 2foo(o2);console.log( o2.a );// undefinedconsole.log( a );// 2,表明a泄漏到全局作用域上了!

這兩個機制的副作用是引擎無法在編譯時對作用域查找進行優化,導致代碼運行速度變慢,建議不要使用它們!

PS:從原理上闡述了博客《 JavaScript語言精粹【糟粕、毒瘤】》中with不能使用的原因!!!

三、函數作用域和塊作用域

匿名和具名

/* 匿名(引用自身只能用過期的arguments.callee引用) */setTimeout(function(){console.log('i wait 1 second!')},1000);/* 具名(可讀性好) */setTimeout(function timeoutHandler(){console.log('i wait 1 seco nd!')},1000);

立即執行函數表達式

/* IIFE模式 */var a = 2;(function IIFE(global){var a = 3;console.log(a);//3console.log(global.a);//2})(window);/* UMD模式 */var b = 2;(function UMD(def){def(window);})(function tmpF(global){var b = 3;console.log(b);//3console.log(global.b);//2});

塊作用域

try/catch會創建一個塊作用域

try{undefined();}catch(err){console.log(err);//可以正常使用}console.log(err);//ReferenceError: err is not defined/* 坑1 */for(var i=0;i<10;i++){}console.log(i);//10/* 坑2 */{console.log(bar);//undefined 不會報錯!!var bar = 2;}

ES6中引入新的let關鍵字!!

/* 填坑1 */for(let i=0;i<10;i++){}console.log(i);//SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode/* 填坑2 */{console.log(bar);//SyntaxError 報錯!!let bar = 2;}

推薦兩個將ES6代碼轉化成兼容ES6之前的環境(大部分是ES5,但不全是)工具:Traceur和let-er

以上就是深入了解JavaScript詞法作用域的詳細內容,更多關于JavaScript詞法作用域的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩不卡手机在线v区| 美女少妇全过程你懂的久久| 超级白嫩亚洲国产第一| 日韩精品视频中文字幕| 蜜桃视频一区二区三区在线观看| 欧美日韩国产一区精品一区| 久久国产毛片| а√天堂中文在线资源8| 久久wwww| 国产精品玖玖玖在线资源| 国产色99精品9i| 国产精品jk白丝蜜臀av小说| 高清一区二区三区av| 在线一区二区三区视频| 美女国产精品| 久久精品亚洲人成影院| 久久婷婷激情| 欧美成a人国产精品高清乱码在线观看片在线观看久 | jiujiure精品视频播放| 国产高清久久| 啪啪国产精品| 国产视频一区免费看| 国内亚洲精品| 久久亚洲国产精品尤物| 午夜日韩福利| 热久久免费视频| 日本少妇精品亚洲第一区| 日韩av三区| 国产综合精品| 日本欧美不卡| 国产精品精品| 国产日韩视频| 国产成人黄色| 亚洲欧美日韩精品一区二区| 亚洲日产国产精品| 成人日韩精品| 久久理论电影| 日韩亚洲国产欧美| 91九色精品| 在线亚洲免费| 日韩不卡在线| 国产女优一区| 婷婷激情久久| 久久精品一区二区三区中文字幕| 制服诱惑一区二区| 久久影视三级福利片| 日韩一区二区三区四区五区| 粉嫩av一区二区三区四区五区 | 欧美永久精品| 中文字幕在线视频久| 久久电影tv| 国产乱论精品| 久久精品人人| 日本不卡视频在线观看| 亚洲一区二区网站| 亚洲天堂成人| 亚洲中午字幕| 欧美国产免费| 欧美在线不卡| 久久久久亚洲| 中文字幕高清在线播放| 麻豆精品在线| 欧美亚洲tv| 免费在线成人网| 石原莉奈在线亚洲三区| 亚洲三级毛片| 亚洲九九精品| 国产免费播放一区二区| 91精品一区二区三区综合| 日韩中文字幕麻豆| 精品视频在线你懂得| 欧美一级专区| 亚洲精品2区| 精品亚洲二区| 日韩欧美久久| 精品国产第一福利网站| 日韩三级一区| 免费日本视频一区| 久久久9色精品国产一区二区三区| 国产一区二区三区视频在线| 欧美国产日本| 奇米777国产一区国产二区| 黄色亚洲精品| 亚洲人妖在线| 亚洲国产日韩欧美在线| 另类亚洲自拍| 精品中文一区| 日韩精品免费观看视频| 久久www成人_看片免费不卡| 四虎在线精品| 欧美a级一区二区| 久久精品成人| 日韩高清在线不卡| 欧美13videosex性极品| 亚洲资源在线| 日韩久久视频| 日韩不卡手机在线v区| 久久国产直播| 国产v综合v| 欧美亚洲在线日韩| 国产suv精品一区二区四区视频| 欧美久久香蕉| 日本在线一区二区三区| 视频一区在线播放| 欧美精品一区二区三区精品| 国产不卡人人| 国产成人久久精品一区二区三区| 国产精品欧美大片| 国产区精品区| 日韩欧美三区| 日精品一区二区三区| 久热精品在线| 影音国产精品| 日韩午夜免费| 红桃视频国产精品| 午夜久久美女| 欧美日韩精品免费观看视欧美高清免费大片| 国产精品xvideos88| 国产精品主播在线观看| 欧美日韩1区| 国产日产精品_国产精品毛片| 日韩精品亚洲一区二区三区免费| 少妇高潮一区二区三区99| 亚洲区国产区| 日韩精品免费视频人成| 日韩一区二区三免费高清在线观看| 蜜桃视频一区二区三区| 国产偷自视频区视频一区二区| av不卡在线| 中文字幕中文字幕精品| 日韩一区精品| 国产日产精品一区二区三区四区的观看方式| 91精品国产自产观看在线 | 91成人在线| 欧美激情视频一区二区三区在线播放| 国产精品对白| 欧美丰满日韩| 久久久蜜桃一区二区人| 伊人精品一区| 免播放器亚洲| 亚洲天堂av资源在线观看| 最新国产精品视频| 欧美亚洲专区| 精品视频在线你懂得| 樱桃视频成人在线观看| 天堂资源在线亚洲| 久久国产88| 欧美一区成人| 国产成人在线中文字幕| 99精品电影| 日韩专区欧美专区| 国产毛片精品| 欧美日韩免费看片| 久久av一区| 国产亚洲高清一区| 国产高清日韩| 蜜桃av在线播放| 亚洲激情国产| 色8久久久久| 国产一区二区三区黄网站| 欧美午夜精品一区二区三区电影| 国产一区二区高清| 久久狠狠久久| 性欧美videohd高精| 日韩视频在线一区二区三区| 日韩欧美四区| 91青青国产在线观看精品| 一区福利视频| 国产精品乱战久久久| 国产精品字幕| 亚洲午夜国产成人| 黄色精品视频| 日韩精品一区第一页| 久久99蜜桃| av亚洲免费| 国产伦乱精品| 91超碰国产精品| 国产精品久久久久久久久久齐齐| 成人久久久久| 国产亚洲精品精品国产亚洲综合| 日韩av一级| 亚洲aa在线| 在线精品亚洲欧美日韩国产| 丝袜a∨在线一区二区三区不卡| 精品视频高潮| 国产一区91| 国产一区精品福利| 亚洲丝袜啪啪| 亚洲天堂资源| 欧美综合精品| 99国产精品99久久久久久粉嫩| 国产精品啊v在线| 免费在线观看成人| 日韩国产激情| 日韩av一区二区三区四区| 久久一区二区三区电影| 欧美韩一区二区| 中文字幕亚洲精品乱码| 91亚洲国产成人久久精品| 日韩高清二区|