j举例:
a=2;
var a;
console.log("a"): ==>2 原因
console.log("a");
var a=2; ===>underfined原因
编译器编译的顺序不同,js编译阶段,编译器的左右就是找到所有的变量声明,并用合适的作用域将它们关联起来,对于一般人来说var a=2仅仅是一个声明,但是js编译器首先对var a=2;这段程序进行编译,然后做好执行他的追呗,并且通常他马上就被执行
以我的理解是,之所以js不需要编译,只是他不像其他语言一样需要翻译成等价的另一种语言,但是仍然需要进行语法的分析和代码生成,并且通常立即执行。js的变量提升和函数提升就发生在编译状态:随着继续了解执行上下文,觉得这里所指的编译器的作用有点类似执行上下文的生命周期的第一阶段
变量声明:var a。。。。
函数的声明:function sayHello(){
console.log("hello"):
}
变量的声明与赋值操作
。。。。。。。
我们接下来要讨论的变量提升和函数提升实质值得是变量声明提升和函数声明的提升,赋值操作会留在原地。
变量提升
a=2;
console.log(a);
var a;
然而代码在执行前被处理为
var a;
a=2;
console.log(a);
不过有一个坑,即对声明变量进行赋值操作。看如下
sayHello();
var sayHello=function(){
console.log('hello');
}//严重出错,VM3188:1 Uncaught TypeError: sayHello1 is not a function
这里为什么变量没有提升????==>这里报的是类型错误。也就是说,其实sayHello被定义了,但他不是一个函数。
如果未定义是 Uncaught ReferenceError: sayNothing is not defined。。
函数提升
所谓函数提升,就是函数的声明在执行前会被提升到该作用域顶部。这里参考变量提升,很容易理解。例如
sayHello();
function sayHello(){
console.log('hello');
}
会成功打印hello。因为函数声明后实际的代码如下
functionsayHello(){
console.log('hello');
}
sayHello();
提升的优先级变量声明谁在后谁优先
即引擎运行时会首先询问作用域,在当前的作用域集中是否已经存在变量的声明,如果是引擎就会使用这个变量;如果否,引擎会继续查找该变量即
function sayHello(){
console.log('hello')
}
而且记住函数是js的第一对象,具有优先性
sayHello();
function sayHello(){
console.log(hi')
}
重点:这里最后的输出是hi,也就是后面的函数声明实际会替代前面的声明的同名函数。