1. 程式人生 > 其它 >JavaScript 作用域、變數提升和嚴格模式

JavaScript 作用域、變數提升和嚴格模式

技術標籤:JavaScript

文章目錄

作用域

全域性作用域

直接編寫在script標籤內的程式碼,都在全域性作用域。其實就是在函式外部定義的。全域性作用域在頁面開啟時建立,在頁面關閉時銷燬。在全域性作用域有一個全域性物件window,我們可以直接使用它。而且所有的全域性變數都是window的屬性,全域性函式都是window的方法。全域性變數在任何地方都可以訪問。

var x=5;
console.log(x);
console.log(window.x);
func();
function func(){
 console.
log(x); }

在這裡插入圖片描述

函式作用域

呼叫函式時建立函式作用域,函式結束後銷燬函式作用域。每一個函式的作用域都是獨立的。在函式內使用變數會先在自身作用域內查詢,如果沒找到就去上一級作用域查詢……

var x=5;
func();
function func(){
    alert(x);
}

在這裡插入圖片描述

        var x=5;
        func();
        function func(){
            var x=10;
            alert(x);
        }

在這裡插入圖片描述

變數提升

在js中,函式及變數的宣告都將被提升到最頂部,所以變數和函式可以先使用再宣告。所以下面兩種寫法的效果是一樣的(只測試變數提升,函式就不測試了):

x=5;
alert(5);
var x;
var x;
x=5;
alert(5);

在這裡插入圖片描述

初始化問題

但是這裡有一個隱藏的問題,就是變數的初始化並不會隨著宣告一起提升。舉個例子:

var x=5;
alert(x);

在這裡插入圖片描述

alert(x);
var x=5;

在這裡插入圖片描述
第一種情況很好理解,第二種情況是因為 x x x的宣告被提前了,但是初始化並沒有被提前,所以在執行 a l e r t ( x ) alert(x) alert(x)時它的值是 u n d e f i n e d undefined undefined

嚴格模式

JavaScript 嚴格模式(strict mode)即在嚴格的條件下執行。它不是一條語句,但是是一個字面量表達式,在 JavaScript 舊版本中會被忽略。“use strict” 的目的是指定程式碼在嚴格條件下執行。嚴格模式下你不能使用未宣告的變數。

//"use strict";
x=5;
alert(x);

在這裡插入圖片描述

"use strict";
x=5;
alert(x);

在這裡插入圖片描述
我們應該儘量使用嚴格模式,它消除了Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為。