欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

JS作用域的陷阱有哪些

這篇文章給大家分享的是有關(guān)JS作用域的陷阱有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)公司是一家網(wǎng)站設(shè)計公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:響應(yīng)式網(wǎng)站設(shè)計高端網(wǎng)站設(shè)計、營銷型網(wǎng)站。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動的體驗(yàn),以及在手機(jī)等移動端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站制作、做網(wǎng)站、移動互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營、VI設(shè)計、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務(wù)。

在 JavaScript 中,代碼塊、函數(shù)或模塊為變量創(chuàng)建作用域。例如 if 代碼塊為變量 message 創(chuàng)建作用域:

if (true) {
  const message = 'Hello';
  console.log(message); // 'Hello'
}
console.log(message); // throws ReferenceError

if 代碼塊作用域內(nèi)可以訪問 message。但是在作用域之外,該變量不可訪問。

好的,這是作用域的簡短介紹。如果你想了解更多信息,建議閱讀我的文章用簡單的詞解釋 JavaScript 作用域。

以下是 5 種有趣的情況,其中 JavaScript 作用域的行為與你預(yù)期的不同。你可能會研究這些案例以提高對作用域的了解,或者只是為面試做準(zhǔn)備。

1. for 循環(huán)內(nèi)的 var 變量

思考以下代碼片段:

const colors = ['red', 'blue', 'white'];

for (let i = 0, var l = colors.length; i < l; i++) {
  console.log(colors[i]); // 'red', 'blue', 'white'
}
console.log(l); // ???
console.log(i); // ???

當(dāng)你打印 li 變量時會發(fā)生什么?

答案

console.log(l) 輸出數(shù)字 3 ,而 console.log(i) 則拋出 ReferenceError

l 變量是使用 var 語句聲明的。你可能已經(jīng)知道,var 變量僅受函數(shù)體作用域限制而并非代碼塊。

相反,變量 i 使用 let 語句聲明。因?yàn)?let 變量是塊作用域的,所以 i 僅在 for 循環(huán)作用域內(nèi)才可訪問。

修復(fù)

l 聲明從 var l = colors.length 改為 const l = colors.length。現(xiàn)在變量 l 被封裝在 for 循環(huán)體內(nèi)。

2. 代碼塊中的函數(shù)聲明

在以下代碼段中:

// ES2015 env
{
  function hello() {
    return 'Hello!';
  }
}

hello(); // ???

調(diào)用 hello() 會怎樣? (代碼段在 ES2015 環(huán)境中執(zhí)行)

答案

因?yàn)榇a塊為函數(shù)聲明創(chuàng)建了作用域,所以在 ES2015 環(huán)境中調(diào)用 hello() 會引發(fā)  ReferenceError: hello is not defined。

有趣的是,在 ES2015 之前的環(huán)境中,在執(zhí)行上述代碼段時不會拋出錯誤。 你知道為什么嗎?請在下面的評論中寫下你的答案!

3. 你可以在哪里導(dǎo)入模塊?

你可以在代碼塊中導(dǎo)入模塊嗎?

if (true) {
  import { myFunc } from 'myModule'; // ???
  myFunc();
}
答案

上面的腳本將觸發(fā)錯誤: 'import' and 'export' may only appear at the top-level

你只能在模塊文件的最頂級作用域(也稱為模塊作用域)中導(dǎo)入模塊。

修復(fù)

始終從模塊作用域?qū)肽K。另外一個好的做法是將 import 語句放在源文件的開頭:

import { myFunc } from 'myModule';

if (true) {
  myFunc();
}

ES2015 的模塊系統(tǒng)是靜態(tài)的。通過分析 JavaScript 源代碼而不是執(zhí)行代碼來確定模塊的依賴關(guān)系。所以在代碼塊或函數(shù)中不能包含 import 語句,因?yàn)樗鼈兪窃谶\(yùn)行時執(zhí)行的。

4. 函數(shù)參數(shù)作用域

思考以下函數(shù):

let p = 1;

function myFunc(p = p + 1) {
  return p;
}

myFunc(); // ???

調(diào)用 myFunc() 會發(fā)生什么?

答案

當(dāng)調(diào)用函數(shù) myFunc() 時,將會引發(fā)錯誤: ReferenceError: Cannot access 'p' before initialization。

發(fā)生這種情況是因?yàn)楹瘮?shù)的參數(shù)具有自己的作用域(與函數(shù)作用域分開)。參數(shù) p = p + 1 等效于 let p = p + 1。

讓我們仔細(xì)看看 p = p + 1

首先,定義變量 p。然后 JavaScript 嘗試評估默認(rèn)值表達(dá)式 p + 1,但此時綁定  p  已經(jīng)創(chuàng)建但尚未初始化(不能訪問外部作用域的變量  let p = 1)。因此拋出一個錯誤,即在初始化之前訪問了 p

修復(fù)

為了解決這個問題,你可以重命名變量 let p = 1 ,也可以重命名功能參數(shù) p = p + 1。

讓我們選擇重命名函數(shù)參數(shù):

let p = 1;

function myFunc(q = p + 1) {
  return q;
}

myFunc(); // => 2

函數(shù)參數(shù)從 p 重命名為 q。當(dāng)調(diào)用 myFunc() 時,未指定參數(shù),因此將參數(shù) q 初始化為默認(rèn)值 p + 1。為了評估 p +1,訪問外部作用域的變量 pp +1 = 1 + 1 = 2

5. 函數(shù)聲明與類聲明

以下代碼在代碼塊內(nèi)定義了一個函數(shù)和一個類:

if (true) {
  function greet() {
    // function body
  }

  class Greeter {
    // class body
  }
}

greet();       // ???
new Greeter(); // ???

是否可以在塊作用域之外訪問 greetGreeter? (考慮 ES2015 環(huán)境)

答案

functionclass 聲明都是塊作用域的。所以在代碼塊作用域外調(diào)用函數(shù) greet() 和構(gòu)造函數(shù) new Greeter() 就會拋出 ReferenceError。

6. 總結(jié)

必須注意 var 變量,因?yàn)樗鼈兪呛瘮?shù)作用域的,即使是在代碼塊中定義的。

由于 ES2015 模塊系統(tǒng)是靜態(tài)的,因此你必須在模塊作用域內(nèi)使用 import 語法(以及 export)。

函數(shù)參數(shù)具有其作用域。設(shè)置默認(rèn)參數(shù)值時,請確保默認(rèn)表達(dá)式內(nèi)的變量已經(jīng)用值初始化。

在 ES2015 運(yùn)行時環(huán)境中,函數(shù)和類聲明是塊作用域的。但是在 ES2015 之前的環(huán)境中,函數(shù)聲明僅在函數(shù)作用域內(nèi)。

感謝各位的閱讀!關(guān)于“JS作用域的陷阱有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

名稱欄目:JS作用域的陷阱有哪些
標(biāo)題鏈接:http://chinadenli.net/article10/ihgido.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、全網(wǎng)營銷推廣網(wǎng)站營銷、用戶體驗(yàn)網(wǎng)站設(shè)計公司、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
国产专区亚洲专区久久| 久久中文字人妻熟女小妇| 久热人妻中文字幕一区二区| 日韩美成人免费在线视频| 又大又紧又硬又湿又爽又猛| 91欧美日韩精品在线| 国产欧美日韩综合精品二区| 午夜精品黄片在线播放| 欧美一区二区三区喷汁尤物| 东北老熟妇全程露脸被内射| 丰满少妇被粗大猛烈进出视频| 精品女同一区二区三区| 日韩国产亚洲欧美激情| 日韩国产亚洲欧美激情| 粉嫩国产一区二区三区在线| 亚洲综合天堂一二三区| 精品国产亚洲区久久露脸| 日本深夜福利在线播放| 日韩人妻精品免费一区二区三区| 男女一进一出午夜视频| 亚洲国产一级片在线观看| 国产一区二区三区丝袜不卡 | 老司机亚洲精品一区二区| 夫妻性生活一级黄色录像| 日韩中文字幕狠狠人妻| 国产欧美一区二区色综合| 日本成人中文字幕一区| 亚洲欧美精品伊人久久| 美女被后入福利在线观看| 国产三级视频不卡在线观看| 国产三级视频不卡在线观看| 尹人大香蕉中文在线播放| 国产欧美另类激情久久久| 欧美黑人在线精品极品| 中文字字幕在线中文乱码二区| 日韩精品小视频在线观看| 国产老女人性生活视频| 久久中文字人妻熟女小妇| 白丝美女被插入视频在线观看| 日韩成人动作片在线观看| 亚洲欧美日本视频一区二区 |