1、关于js没有块级作用域
JavaScript是由ECMAScript、DOM、BOM三部分组成。
JavaScript中作用域有:全局作用域、函数作用域。es6之前没有块级作用域。
ES6中新增了块级作用域。块作用域由 { } 包括,比如 if语句和for语句里面的{ }。
2、var、let、const区别
var
- var定义的变量
可以
跨块作用域访问到
{
var a = 1;
console.log(a); //1
};
console.log(a);//1
- var定义的变量
不能
跨函数作用域访问到
(function B() {
var b = 2;
console.log(b);//2
})();
console.log(b);// 报错
let
- let定义的变量,
只能
在块作用域里面访问
{
let c = 3;
{
console.log(c);//3 子作用域可以访问到父作用域的变量
}
}
- let定义的变量
不能
跨块作用域访问到
{
let d = 1;
console.log(d);//1
};
console.log(d);// 报错
- let定义的变量
不能
跨函数作用域访问到
(function E() {
let e = 2;
console.log(e);//2
})();
console.log(e);// 报错
const
const
用来定义常量,使用时必须必须
赋值,不能
初始化。
{
const f ;
console.log(f); // 报错
};
只能
在块作用域里访问,而且不能修改。不能
跨块
{
const g = 1;
console.log(g);// 1
g=2;
console.log(g);// 报错
};
console.log(g);// 报错 不能跨块
3、什么是变量提升
- 变量提升-----就是把变量声明提升到作用域的最顶端上去,仅提升声明,不提升初始化(赋值语句)。函数提升也是只提升函数声明,不提升初始化。
- 同一个变量只会声明一次,其他的会被忽略掉。
- 函数声明优先级>变量声明优先级。
- var有变量提升,let没有变量提升。
例1
例2
console.log(b);//undefined
var b=3;
相当于:
var b
console.log(b);//undefined
b=3;
例3
c=4;
var c;
console.log(c)//4
例4(函数提升)
fn2("tom");
function fn2(name) {
console.log("my name is:" + name);//my name is:tom
}