1.作用域簡(jiǎn)介
- 作用域最大的用處:隔離變量,不同作用域下同名變量之間不會(huì)有沖突
- 作用域中變量值在執(zhí)行過程中產(chǎn)生,而作用域卻是在函數(shù)創(chuàng)建時(shí)確定了
作用域
2.變量提升
在ES6還沒有出來的之前,JavaScript只有全局作用域和函數(shù)作用域,并沒有塊級(jí)作用域(一個(gè){ }即為一個(gè)塊級(jí)作用域)的概念。無論var聲明的變量處于當(dāng)前作用域的第幾行,都會(huì)被提升到作用域的頭部,并被初始化為undefined——變量提升
console.log(global); // undefined
var global = 'global';
console.log(global) // global
function fn() {
console.log(a); // undefined
var a = 10;
console.log(a); // 10
}
fn();
之所以會(huì)有上面的結(jié)果是因?yàn)镴S的變量提升導(dǎo)致的,上面的代碼其實(shí)是這樣執(zhí)行的:
var global; // 變量提升,全局作用域范圍內(nèi),此時(shí)只是聲明并沒有賦值
console.log(global); // undefined
global = 'global'; // 此時(shí)才賦值
console.log(global) // global
function fn() {
var a; // 變量提升,函數(shù)作用域范圍內(nèi),此時(shí)只是聲明并沒有賦值
console.log(a); // undefined
a = 10; // 此時(shí)才賦值
console.log(a); // 10
}
fn();
3.函數(shù)提升
在JS中創(chuàng)建函數(shù)有兩種方式函數(shù)聲明和函數(shù)字面量,只有函數(shù)聲明存在函數(shù)提升。
console.log(fn1); // function fn1 () {console.log('我是fn1');}
console.log(fn2); // undefined
function fn1 () {console.log('我是fn1');}
var fn2 = function() {
console.log('我是fn2');
}
因?yàn)楹瘮?shù)聲明的函數(shù)提升,導(dǎo)致上面的結(jié)果,上面的代碼其實(shí)是這么執(zhí)行的:
function fn1() {
console.log('我是fn1');
}
var fn2;
console.log(fn1); // function fn1 () {console.log('我是fn1')}
console.log(fn2); // undefined
fn2 = function () {
console.log('我是fn2');
}
console.log('***', fn2); // fn2 = function() {console.log('我是fn2');}
4.強(qiáng)化訓(xùn)練
(function () {
console.log(a); // undefined
a = 'aaa';
var a = 'bbb';
console.log(a); // 'bbb'
}
)()