JS中的作用域 作用域鏈和預解析

2021-09-07 04:31:57 字數 1902 閱讀 1135

全部變數

js中除了在函式中定義的變數,都是全域性變數

全域性變數的使用範圍是作用域

作用域:就是變數的使用範圍

js中沒有塊級作用域即一對括號中定義的變數,這個變數可以在大括號外面使用

例如

結果是

10
並不會報錯,因為變數可以在大括號外面使用(除了函式中定義的變數)

下面的這些也都可以輸出,並不會報錯

以上是全域性變數

隱式全域性變數也是全域性變數

例如下面的變數num就是隱式全域性變數,也就是在函式中賦值卻沒有定義的變數,可以在函式外使用

function f1() 

f1();

console.log(num);

結果是

10
區域性變數就是在函式中定義的變數,不能在函式外使用

例如

function f1() 

f1();

console.log(num);

執行結果會報錯,因為是區域性變數

主要體現在變數的使用方面,從裡向外,層層的搜尋,搜尋到了就使用,最後都沒有找到就報錯

例如

var num=10; //作用域鏈 級別:0

function f1()

f2();

}f1();

從裡到外,先搜尋到var num=30,所以控制台可以看到結果是

30
假如沒有var num=30,則先找到var num=20,此時結果是

20
假如只有var num=10,結果是

10
假如連var num=10都沒有,則**報錯

這就是作用域鏈。

預解析就是在瀏覽器解析**之前,把變數的宣告和函式的宣告提前(提公升)到該作用域的最上面。

提前變數的宣告

console.log(num);

var num=100;

這樣**並不會報錯,輸出結果是

undefined
因為預解析會把變數的宣告提前,但是並不會把賦值提前,預解析後的**如下

var num;

console.log(num);

num=100;

函式的宣告提前

f1();

function f1()

執行結果是

qwq
預解析把函式宣告提前,所以預解析後**如下

function f1() 

f1();

但是有時候預解析也會帶來不好的效果,例子如下

f1();

var f1=function () ;

此時因為預解析的緣故,變數宣告提前了,反而導致報錯。此時預解析**如下:

var f1;

f1();

f1=function () ;

此時的f1雖然定義了,但是並沒有賦值,所以變數f1的值是undefined,f1()則會報錯.

面試必備 作用域 作用域鏈 預解析

1.變數分為區域性變數和全域性變數,2.作用域 就是變數的使用範圍 所以,作用域也分為區域性作用域和全域性作用域 3.js中沒有塊級作用域,也就是說 一對大括號 定義的變數,這個變數可以在大括號外面使用。栗子1 栗子2 栗子3 4.函式中定義的變數是區域性變數 5.作用域鏈 變數的使用,從裡向外,層...

js中的作用域 預解析

任何地方都能訪問到的物件擁有全域性作用域。1.1函式外面定義的變數擁有全域性作用域 1.2未定義直接賦值的變數自動宣告為擁有全域性作用域 通俗地講,當宣告乙個函式時,區域性作用域一級一級向上包起來,就是作用域鏈。1.當執行函式時,總是先從函式內部找尋區域性變數 2.如果內部找不到 函式的區域性作用域...

js的預解析和作用域

預解析指的就是,在js檔案或者script裡面的 在正式開始執行之前,進行的一些解析工作。這個工作很簡單,就是在全域性中尋找var關鍵字宣告的變數和通過function關鍵字宣告的函式。1.尋找 var function 引數 等關鍵字,根據var a提前設定為 a 未定義 undefined 所有...