javascript深入理解系列文章网址
https://www.jianshu.com/p/451eed9094f5
在理解这些之前我们先讲一下变量提升的概念,和区块的运行方式,有助于后面的理解
变量提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量(这里注意只是变量名,没有赋值),然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
console.log(a);
var a=6;
比如我们写上面的这些代码,javascript会怎么运行呢?
var a;
console.log(a);
a=1;
会输出undefined,因为还没有赋值
区块
JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。
常见的区块有if,for,while,switch,function,和其他强类型语言的区别是,除了function,对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)。就是说加{}和不加没有区别。
if(true){
var i=0;
}
console.log(i);//输出0
for(var i=0;i<3;i++){
}
console.log(i);//输出3
函数名的提升
和变量提升一样,javascript引擎将函数名视为变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,被提升到代码头部。
fn();
function fn(){
console.log("111");
}
所以这种情况是不会报错的
但是如果采用赋值语句定义函数,JavaScript 就会报错。
fn();
var fn=function(){
console.log(1111);
}
这种形式等同于
var fn;
fn();
fn=function(){
console.log(1111);
}
fn变量名被提升至顶部,未赋值为undefined,所以在调用的时候会报错
网友评论