var a = 'a'; // 声明全局变量a全局变量a
fun(); // f是函数,虽然定义在调用的后面,但是函数声明会提升到作用域的顶部。
console.log(a); // a=>'a', 此时是全局变量的a
function fun() {
console.log(a); // 当前的a变量是下面变量a声明提升后,默认值undefined
var a = 'aa';
console.log(a); // a => 'aa'
}
//结果:undefined aa a
函数声明会在变量声明上面
var a='a'
function a(){
console.log(a)
}
a()
//结果:a is not a function
js引擎代码解析:
function a(){
console.log(a)
}
console.log(a)
var a//声明过的变量不会重复声明,所以在这时候,a是个函数
a='a'//将function->'a'
a()//这时候’a‘已经赋值给a变量了,a()当然会报错了
eg:
fun()
var fun = function(){
console.log("aaa");
}
//结果: 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);
结果:ƒ 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不变量提升,暂时性死区
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循环体里面用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
}