var a = 'a'; // 聲明全局變量a全局變量a
fun(); // f是函數(shù),雖然定義在調(diào)用的后面,但是函數(shù)聲明會提升到作用域的頂部。
console.log(a); // a=>'a', 此時是全局變量的a
function fun() {
console.log(a); // 當前的a變量是下面變量a聲明提升后,默認值undefined
var a = 'aa';
console.log(a); // a => 'aa'
}
//結(jié)果:undefined aa a
函數(shù)聲明會在變量聲明上面
var a='a'
function a(){
console.log(a)
}
a()
//結(jié)果:a is not a function
js引擎代碼解析:
function a(){
console.log(a)
}
console.log(a)
var a//聲明過的變量不會重復聲明,所以在這時候,a是個函數(shù)
a='a'//將function->'a'
a()//這時候’a‘已經(jīng)賦值給a變量了,a()當然會報錯了
eg:
fun()
var fun = function(){
console.log("aaa");
}
//結(jié)果: fun is not a function
//解析
var fun;//這時候fun->undefined
fun(); //foo is not a function
fun = function(){
console.log("aaa");
}
//也可以理解成這樣
console.log(a,'a')//a=>undefined那是因為,先聲明的變量,然后打印,最后賦值
var a='333'
eg:
console.log(fun);
var fun='str';
console.log(fun);
function fun(){}
console.log(fun);
結(jié)果:? fun(){} str str
//解析
function fun(){}
var fun;//f聲明過的變量不會重復聲明
console.log(fun)
fun=10
console.log(fun)//10
console.log(fun)//10
console.log(a)//undefined
console.log(b)//報錯
var a='a'
let b='b'
eg:
var a = 10;
{
console.log(a)//10
var a = 6;
console.log(a)//6
}
console.log(a)//6
var a = 10;
{
// console.log(a)//報錯,因為let不變量提升,暫時性死區(qū)
let a = 6;
console.log(a)//6
}
console.log(a)//10
不可重復聲明
{
let b='b-let'
let b='same-b'//報錯 Identifier 'b' has already been declared
}
//看下面例子,為什么我同時聲明了兩次q,卻沒有報錯。因為for 用let聲明q跟,for循環(huán)體里面用let聲明的q不在同一個塊級作用域里面
// {
// let q=0
// {
// let q=12
// console.log(q)
// }
// ……
// }
for(let q=0;q<5;q++){
let q=12
console.log(q)// 12
}