日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS 作用域与变量提升---JS 学习笔记(三)

發(fā)布時間:2025/6/15 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS 作用域与变量提升---JS 学习笔记(三) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

你知道下面的JavaScript代碼執(zhí)行時會輸出什么嗎?

var foo = 1; function bar() {if (!foo) {var foo = 10;}console.log(foo); } bar();

答案是“10”,吃驚嗎?那么下面的可能會真的讓你大吃一驚:

?

var a = 1; function b() {a = 10;return;function a() {} } b(); console.log(a);

答案是 “1”。為什么會這樣呢,這就涉及到 JS 里面的作用域、作用域鏈和提升的相關(guān)知識了。

首先要明白 作用域和作用域鏈的內(nèi)容(點擊閱讀),現(xiàn)在主要介紹提升。

?

在 JavaScript 中,當遇到 var a = 1; 這個語句時,我們可能會這么認為,“為一個變量分配內(nèi)存,給這個變量命名為 a,再把 1 保存進去”。然而這個過程并不完全正確。當編譯器遇到 var a = 1 時,會做以下兩個步驟:

1. 遇到 var a ,首先會先看看當前的作用域中是否已經(jīng)有 a,若有,就不再聲明 a,若沒有,就會在當前的作用域,創(chuàng)建一個 a

2. 然后處理 a = 1 。先查看當前作用域,是否有 a 。如果有,就把 1 賦值給 a 。如果沒有,就向上一個作用域中尋找 a,直到尋找到全局作用域。全局作用域中如果還沒有,就會拋出異常。

所以,當我們看到 var a = 1; 會認為這是一個聲明,實際上這是兩個聲明, var a 和 a = 1 。第一個聲明會在編譯階段進行,第二個聲明會在原地等待執(zhí)行。函數(shù)聲明和變量聲明總會被 JavaScript 的編譯器提升到他們所在作用域的頂部。有了這些知識就可以解釋上面的代碼了

第一段代碼實際上如下圖:在遇到并執(zhí)行 bar()函數(shù)時,執(zhí)行到 if 語句里面的 foo,此時會先查詢 bar()函數(shù)的作用域內(nèi)有沒有聲明 foo:

若沒有聲明,就像上一個作用域中尋找 foo 有沒有被聲明。

若聲明了,就直接將聲明提升到 bar 作用域里的頂部(foo = 10 留在原地按順序等待執(zhí)行),這樣,foo 就是 undefined,!foo 就是 true,可以進入 if 循環(huán)。

第二段代碼實際上如下圖:執(zhí)行 b()時,首先就是 a = 10;這條語句,執(zhí)行這條語句之前,先看 a 在 b 中是否被聲明,若沒有被聲明就向上一個作用域中尋找 a ,現(xiàn)在的情況是,在 b 函數(shù)內(nèi)部,a 以函數(shù)聲明的方式,被聲明了,那么就要把這個 a 函數(shù)聲明提升到 a 所在的作用域的頂部,再按順序執(zhí)行后面的代碼。

?

?

?

對于提升總結(jié)的知識點:

1. 函數(shù)聲明和變量聲明都會提升,但在同一個作用域相同名字的函數(shù)聲明優(yōu)先于變量聲明。

2. 變量聲明會提升,但變量賦值的過程不會提升,會在原地等待被執(zhí)行。

3. 提升后,賦值語句會向前覆蓋提升的內(nèi)容。例子 2 中,b 函數(shù)的內(nèi)部,最開始 a 是函數(shù)提升,a 的本質(zhì)是函數(shù),但是函數(shù)提升后,執(zhí)行了一個賦值語句:a = 10;此時,a 就是一個 number 類型的變量了。

?

對于這種情況,我們在寫 JavasScript 代碼的時候該怎么做呢?

使用單 var 模式:避免變量提升所帶來的問題

/*jslint onevar: true [...] */ function foo(a, b, c) {var x = 1,bar,baz = "something"; }

?

本文參考以下資料:

顏海鏡的博客:JavaScript作用域鏈和提升機制

你不知道的JavaScript

JavaScript高階程序設(shè)計

?

轉(zhuǎn)載于:https://www.cnblogs.com/rougan/p/10606755.html

總結(jié)

以上是生活随笔為你收集整理的JS 作用域与变量提升---JS 学习笔记(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。