es5的scope和變數提公升

2021-07-28 08:30:24 字數 1543 閱讀 2324

最近在學習es6,看到es6的作用域、新增的let和const宣告命令和es5有了很大的不同,所以想著總結下es5的作用域和變數提公升。

es5是沒有塊級作用域的,當你在函式外宣告乙個變數,那麼你在**任何地方都能訪問到,這個變數也被稱為全域性變數,擁有全域性作用域;當你在乙個函式內部宣告變數的話,那麼就只能在函式內部訪問,這個變數被稱為區域性變數。

//es5沒有塊級作用域,所以宣告賦值的num是全域性的

if (true)

console.log(num); // 5

//只有在函式內部宣告變數才能稱為區域性變數,不能被全域性訪問到

function

test

() console.log(num2); //uncaught referenceerror: num2 is not defined

var宣告的變數提公升,賦值不提公升。也就是說,用var命令宣告賦值的語句,宣告會被提公升到當前作用域頂部,賦值卻不提公升。

//

var num被提公升到頂部,賦值不提公升,所以就算是不執行,也不會報錯,只是列印undefined

if (false)

console.log(num); //

undefined

//var num2被提公升到頂部,num2=3沒有提公升,所以num2===undefined

console.log(num2 === undefined); //

true

var num2 = 3;

//宣告var num3提公升到函式頂部,全部變數num3被覆蓋,而函式內部賦值不提公升,所以列印undefined

var num3 = "my value";

(function() )();

//不要被迷惑了,想著這裡也是undefined,其實函式內部只有賦值語句,而賦值不提公升,所以列印的是全域性的變數

var num4 ='變數值';

(function())();

這裡如果函式是宣告式方法建立,則整體提公升;如果是表示式方法建立則跟var提公升規則相同。

//如果函式宣告方法建立函式,則函式整體提公升到頂部

var temp = fun;

console.log(temp); //

function fun()

function fun()

//如果函式表示式建立函式,則跟var變數提公升相同的規則

var temptwo = funtwo;

console.log(temptwo); //

undefined

var funtwo = function () ;

//這個舉個不太合適例子(同名)為了說明function和var變數誰在更頂部,事實證明function提公升的位置在var之前,就算兩者交換位置也是一樣

console.log(test); //

function test()

function test()

var test = 'dd';

變數宣告系列之ES5 變數提公升

es5變數宣告方式有var,function。通過這兩種方式宣告的變數特點就是具有 變數提公升 的效果,一般想法是乙個變數是先宣告後使用,然而如果採用var 或者function宣告的變數和函式 函式表示式不會提公升 具有提公升的效果。下面詳細說明變數提公升究竟是怎麼產生的。在引擎中執行之前都會經歷...

js中的變數 ES5 和常量

變數,即可變的量,es5中使用var定義。如果沒有定義直接賦值,該變數就是這個值。a 3 console.log a 3如果沒有定義和賦值,直接呼叫就會報錯 console.log a uncaught referenceerror a is not defined如果定義,沒有賦值,直接呼叫的結果...

ES6和ES5的區別

es6和es5的區別?1 定義變數 es5中用 var function es6中用 let const class import 沒有變數提公升 同乙個作用域中不可重複宣告 不會給window增加全域性屬性 會形成塊級作用域 const設定的變數值是不可修改的 理解為常量 暫時性死區 2 解構賦值...