全部變數
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 所有...