日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

深入理解 JavaScript 中的 With 語句

來源: 責編: 時間:2024-07-19 07:56:35 223觀看
導讀通常來說,所有 JavaScript 開發(fā)人員都有一個共同的概念:“避免使用 with 語句。” 這條準則無疑是正確的,但并不是每個人都能很好地解釋為什么。雖然只記住“不要使用它”的結(jié)果就足夠了,但理解其背后的原因?qū)τ谏钊肜斫?/div>

RQ028資訊網(wǎng)——每日最新資訊28at.com

通常來說,所有 JavaScript 開發(fā)人員都有一個共同的概念:“避免使用 with 語句。” 這條準則無疑是正確的,但并不是每個人都能很好地解釋為什么。雖然只記住“不要使用它”的結(jié)果就足夠了,但理解其背后的原因?qū)τ谏钊肜斫?JavaScript 語言和編寫高質(zhì)量代碼非常有幫助。RQ028資訊網(wǎng)——每日最新資訊28at.com

with 語句

with 語句的初衷是為了避免冗長的對象調(diào)用:RQ028資訊網(wǎng)——每日最新資訊28at.com

foo.bar.baz.x = 1;foo.bar.baz.y = 2;foo.bar.baz.z = 3;with(foo.bar.baz) {    x = 1;    y = 2;    z = 3;}

但實際上,使用變量替換是相當簡單的:RQ028資訊網(wǎng)——每日最新資訊28at.com

var p = foo.bar.baz;p.x = 1;p.y = 2;p.z = 3;

因此,看起來一開始就不需要 with。如今,使用 with 的人已經(jīng)很少了。在嚴格模式下,使用 with 會直接報錯:RQ028資訊網(wǎng)——每日最新資訊28at.com

function foo() {    'use strict';    with ({}) {}}

因此,with 已經(jīng)被完全廢棄,人們甚至懶得去關(guān)注其原因。RQ028資訊網(wǎng)——每日最新資訊28at.com

書中的陳述

既然是總結(jié),我想盡可能全面,所以讓我們先從書籍開始。關(guān)于 JavaScript 的書籍,以下是一些主要參考:RQ028資訊網(wǎng)——每日最新資訊28at.com

《JavaScript 權(quán)威指南》(第 5 版,David Flanagan,P109):RQ028資訊網(wǎng)——每日最新資訊28at.com

with (Object) statement with 語句用于暫時修改作用域鏈… 這種語句實際上是將對象添加到作用域鏈的開頭,然后執(zhí)行語句,再將作用域鏈恢復到原來的狀態(tài)… 盡管有時使用 with 語句更方便,但人們反對使用它。使用 with 語句的 JavaScript 代碼難以優(yōu)化,因此其執(zhí)行速度比不使用 with 語句的等效代碼慢得多。此外,在 with 語句中定義函數(shù)和初始化變量可能會產(chǎn)生與直覺相悖的意外行為(這種行為及其原因非常復雜,我們在此不再解釋)。RQ028資訊網(wǎng)——每日最新資訊28at.com

《JavaScript 高級程序設(shè)計》(第 3 版,Nicholas C. Zakas,P60):RQ028資訊網(wǎng)——每日最新資訊28at.com

with 語句的目的是將代碼的作用域設(shè)置為特定對象… 由于頻繁使用 with 語句導致的性能下降,以及調(diào)試代碼的困難,不建議在開發(fā)大型應用程序時使用 with 語句。RQ028資訊網(wǎng)——每日最新資訊28at.com

《JavaScript 語言精粹》(Douglas Crockford,P110):RQ028資訊網(wǎng)——每日最新資訊28at.com

這個語言中存在 with 語句嚴重影響了 JavaScript 處理器的速度,因為它破壞了變量名的詞法作用域綁定。它的初衷是好的,但如果沒有它,JavaScript 語言會稍微好一些。RQ028資訊網(wǎng)——每日最新資訊28at.com

《深入理解 ECMAScript 6》(Axel Rauschmayer,P153):RQ028資訊網(wǎng)——每日最新資訊28at.com

這本書是我唯一一本用了一頁多的篇幅詳細解釋了 JavaScript 中廢棄 with 的原因的基礎(chǔ)參考書。RQ028資訊網(wǎng)——每日最新資訊28at.com

好了,讀了這么多書,讓我們現(xiàn)在進入本文的主要話題:RQ028資訊網(wǎng)——每日最新資訊28at.com

為什么不使用 with 語句?

綜上所述,主要考慮如下:RQ028資訊網(wǎng)——每日最新資訊28at.com

性能問題

with 語句存在明顯的性能問題,這在幾乎所有參考書中都有提到,但很少有例子來說明這一點。你可以自己進行代碼測試,以更直觀地量化理解 with 語句的性能。RQ028資訊網(wǎng)——每日最新資訊28at.com

var a = {a: {a: 1}};function useWith() {    with (a.a) {        for (var i = 0; i < 1000000; i++) {            a = i;         }    }}var b = {b: {b: 1}};function noWith() {    for (var i = 0; i < 1000000; i++) {        b.b.b = i;     }}var t1 = new Date().getTime();useWith();alert(new Date().getTime() - t1);var t2 = new Date().getTime();noWith();alert(new Date().getTime() - t2);

在對象屬性賦值一百萬次時,性能差異是否顯著?RQ028資訊網(wǎng)——每日最新資訊28at.com

RQ028資訊網(wǎng)——每日最新資訊28at.com

當然,在實際使用中,極少有執(zhí)行數(shù)百萬次的循環(huán),損失在可接受范圍內(nèi)。因此,性能損失并不是廢棄 with 語句的主要原因。RQ028資訊網(wǎng)——每日最新資訊28at.com

不可預測性

使用 with 語句導致的不可預測性是廢棄 with 的根本原因。with 強行截斷詞法作用域,臨時將對象插入作用域鏈。這導致代碼變得難以捉摸。RQ028資訊網(wǎng)——每日最新資訊28at.com

例如:RQ028資訊網(wǎng)——每日最新資訊28at.com

function foo(a) {    with (a) {        console.log(a);    }}foo("sword");     // 輸出: swordfoo({});          // 輸出: [object Object]foo({a: "sword"}); // 輸出: {a: "sword"}

在這個簡單例子中,字符串 "sword" 和空對象沒有問題。然而,當傳遞的參數(shù)是具有名為 a 的屬性的對象時,強行發(fā)生 a.a 訪問。RQ028資訊網(wǎng)——每日最新資訊28at.com

這只是一個參數(shù)的情況。如果有很多參數(shù)呢?當不知道傳入?yún)?shù)有什么屬性時,可以想象在多個參數(shù)之間引用各種屬性會有多么混亂。這就是所謂的“令人驚訝和違反直覺”的行為本質(zhì)。RQ028資訊網(wǎng)——每日最新資訊28at.com

此外,在 with 語句中聲明的變量并不屬于 with 指定的對象:RQ028資訊網(wǎng)——每日最新資訊28at.com

var a = {};   with (a) {    x = 'sword';    var y = 'wang';}console.log(a.x);        // undefinedconsole.log(a.y);        // undefinedconsole.log(window.x);   // swordconsole.log(window.y);   // wang

在 with 中聲明的變量被添加到外部函數(shù)中。RQ028資訊網(wǎng)——每日最新資訊28at.com

function foo() {    with ({}) { x = 'sword'; }    console.log(x);}foo();  // 輸出: sword

這可能和你想象的有些不同。RQ028資訊網(wǎng)——每日最新資訊28at.com

單單通過標識符及其上下文,是無法確定語句中的標識符指向什么的。這才是 with 被棄用的真正原因。它強行混淆了上下文,使程序的預測和解析變得困難,導致了后面會討論的優(yōu)化問題。RQ028資訊網(wǎng)——每日最新資訊28at.com

代碼無法優(yōu)化

由于無法預測,代碼的含義不斷變化。不同的調(diào)用,甚至相同的調(diào)用,由于運行時的變化可能會偏離,使得代碼無法優(yōu)化。RQ028資訊網(wǎng)——每日最新資訊28at.com

優(yōu)化涉及兩個方面。一方面,解析和執(zhí)行變慢,這指的是前面提到的性能。另一方面,對于代碼優(yōu)化和壓縮工具,如果無法確定是否正在使用變量或?qū)傩裕瑒t無法重命名(因為屬性無法重命名)。RQ028資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

在這個炎熱的夏天,我可能被熱氣蒸得有些思維散亂。心血來潮,我翻出了幾本關(guān)于 JavaScript 的書,想要探討一下這個被廣泛詬病的 with 語句。說著說著,似乎偏離了主題,胡亂扯了一些看似深奧但不太實用的內(nèi)容。寫完之后,我自己都覺得“哇,這人真閑”。RQ028資訊網(wǎng)——每日最新資訊28at.com

哦,對了,文章開頭還有一個冷笑話,說 JavaScript 比 Java 多 60%。我只是在調(diào)侃它們的字符數(shù)。“JavaScript” 比 Java 多五個字母;如果你堅持數(shù)字符,那么大概是多了 60%。好吧,可能這個笑話有點冷,難怪外面這么熱——看來我得冷靜一下。RQ028資訊網(wǎng)——每日最新資訊28at.com

寫這些東西可以算是一種消暑和消磨時間的方式。希望你讀到這里時,也能在這個夏季找到屬于你的涼爽享受。至于 with 語句——了解它并擱置一旁,因為我們反正不會用了,不是嗎?RQ028資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-101704-0.html深入理解 JavaScript 中的 With 語句

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 直接把任意網(wǎng)站變?yōu)?API 接口?Firecrawl有點牛了!

下一篇: 2024 React 生態(tài)工具最能打的組合!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美亚洲在线观看| 欧美一级艳片视频免费观看| 国产欧美日韩视频| 国产精品chinese| 国产视频精品免费播放| 国产一区深夜福利| 136国产福利精品导航网址| 最新成人在线| 亚洲校园激情| 久久精品视频va| 欧美精品福利| 国产亚洲欧美一区| 亚洲欧洲日产国产网站| 亚洲一区二区三区午夜| 久久在线视频在线| 国产精品国色综合久久| 欧美亚男人的天堂| 一区一区视频| 一区二区三区三区在线| 久久精品女人的天堂av| 欧美精品色一区二区三区| 国产精品欧美精品| 亚洲国产精品第一区二区| 亚洲已满18点击进入久久| 久久久蜜桃一区二区人| 欧美日韩hd| 好吊色欧美一区二区三区视频| 亚洲精品美女久久久久| 欧美一区二区三区四区高清| 欧美电影在线播放| 国产一区二区日韩精品| 99国产精品久久久久久久成人热| 欧美亚洲免费电影| 欧美老女人xx| 狠狠色狠色综合曰曰| 亚洲网在线观看| 欧美成人免费一级人片100| 国产一级精品aaaaa看| 一区二区高清视频在线观看| 快播亚洲色图| 国产日韩一区二区三区| 在线午夜精品自拍| 免费国产自线拍一欧美视频| 国产欧美精品一区二区三区介绍| 亚洲精品久久嫩草网站秘色| 久久精品久久综合| 国产精品捆绑调教| 亚洲精品乱码久久久久久| 欧美一级欧美一级在线播放| 欧美色图首页| 亚洲精品裸体| 麻豆成人av| 国内精品伊人久久久久av一坑 | 亚洲一区二区精品在线观看| 嫩模写真一区二区三区三州| 国产无一区二区| 亚洲欧美国产精品va在线观看| 欧美日韩国产小视频在线观看| 亚洲第一久久影院| 久久婷婷麻豆| 国内精品久久久久久久果冻传媒| 亚洲欧美日本伦理| 国产精品第一页第二页第三页| 亚洲九九九在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 国产在线不卡| 欧美一区二区三区婷婷月色 | 欧美成人午夜剧场免费观看| 国内精品久久久久久久果冻传媒 | 久久精品二区三区| 国产欧美一区二区三区视频| 先锋a资源在线看亚洲| 国产精品久久久久久久7电影| 在线视频精品一区| 欧美日韩精品一本二本三本| 日韩一级精品| 欧美日韩国产一区精品一区| 亚洲免费精品| 欧美日韩xxxxx| 日韩网站在线观看| 欧美日韩播放| 一区二区三区欧美| 欧美三日本三级少妇三2023| 一区二区三区四区五区精品| 欧美视频一区二区三区四区| 一区二区三区 在线观看视频| 欧美激情一区二区三区四区 | 午夜精品久久| 国产欧美视频一区二区| 欧美在线视频在线播放完整版免费观看 | 一区二区三区波多野结衣在线观看| 欧美伦理a级免费电影| 99国产精品自拍| 欧美午夜一区二区三区免费大片| 亚洲午夜小视频| 国产女主播在线一区二区| 欧美一区二区三区日韩视频| 韩国一区二区三区美女美女秀| 久久综合狠狠| 亚洲欧洲另类| 欧美人交a欧美精品| 在线视频欧美精品| 国产精品一区二区三区四区| 久久国产一二区| 亚洲第一精品电影| 欧美日韩精品中文字幕| 亚洲一区综合| 国产一区二区三区久久精品| 噜噜噜噜噜久久久久久91| 亚洲免费成人av| 欧美日韩一区二区免费视频| 亚洲欧美日韩国产中文在线| 国产原创一区二区| 欧美国产综合视频| 亚洲一级在线观看| 国产视频自拍一区| 欧美96在线丨欧| 一区二区高清在线观看| 国产欧美大片| 欧美xart系列高清| 亚洲天堂av高清| 国内精品美女av在线播放| 欧美国产日韩在线| 亚洲欧美日韩国产一区| 一区在线视频| 欧美午夜不卡| 久久深夜福利| 亚洲一区二区三区午夜| 激情久久久久久久| 欧美日韩亚洲91| 久久国产一二区| av成人国产| 国内久久精品| 欧美日韩一二区| 久久久久久亚洲精品中文字幕| 91久久在线| 国产乱码精品一区二区三区五月婷 | 国产欧美日韩精品一区| 欧美xx视频| 午夜在线视频观看日韩17c| 最近看过的日韩成人| 国产精品一区二区你懂的| 欧美 日韩 国产一区二区在线视频| 一区二区免费在线观看| 一区三区视频| 国产精品一区二区久久国产| 欧美激情自拍| 久久久噜噜噜久噜久久| 亚洲五月婷婷| 亚洲人体大胆视频| 国内精品久久久久久久果冻传媒| 欧美日韩国产在线| 老司机精品导航| 香蕉国产精品偷在线观看不卡| 亚洲精品色婷婷福利天堂| 国产真实精品久久二三区 | 亚洲黄色影院| 国产偷国产偷精品高清尤物| 欧美日韩一区不卡| 欧美成人三级在线| 久久精品免费播放| 亚洲一区二区三区视频播放| 亚洲精品少妇30p| 激情综合自拍| 国产日韩av高清| 国产精品v亚洲精品v日韩精品| 欧美成年网站| 久久亚洲色图| 欧美在线黄色| 亚洲专区一区| 中文精品一区二区三区 | 中国女人久久久| 亚洲品质自拍| 1024成人| 狠狠色噜噜狠狠狠狠色吗综合| 国产精品一区二区久久精品| 国产精品成人久久久久| 欧美日韩大片| 欧美极品欧美精品欧美视频| 狂野欧美激情性xxxx欧美| 久久国产免费看| 欧美在线日韩在线| 午夜国产精品影院在线观看| 亚洲午夜av电影| 中文精品在线| 日韩一级黄色av| 日韩视频在线观看| 亚洲乱码国产乱码精品精可以看| 亚洲国产精品国自产拍av秋霞 | 亚洲国产高清在线| 亚洲成人直播| 亚洲电影视频在线| 悠悠资源网亚洲青| 精品av久久707| 黄色成人免费网站| 韩国精品主播一区二区在线观看| 国产一区二区看久久| 国产日产亚洲精品系列| 国产亚洲精品bt天堂精选| 国产日产亚洲精品| 国产亚洲一区在线| 黑人极品videos精品欧美裸| 国语自产偷拍精品视频偷| 含羞草久久爱69一区|