最近在學習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 解構賦值...