一:js 中的变量提升例1

a = 2;var a;console.log(a);

答:2

解析:它会将当前作用域的所有变量的声明提升到程序的顶部,上述代码等价为:

var a; a = 2console.log(a); // 2

例2:

console.log(a);// undefined var a = 2;

解析:变量的声明提升到程序的顶部;等价于:

var a;console.log(a); a = 2;

问题:为什么会有变量提升?

其实啊,js和其他语言一样,都要经历编译和执行阶段,而在编译的时候,会搜集所有的变量并且在本作用域内提前声明,而且其他代码都不会改变顺序。

1:作用域:除了函数外,js是没有块级作用域

2:作用域链:内部可以访问外部的变量,但是外部不能访问内部的变量。注意:如果内部有,优先查找到内部,如果内部没有就查找外部的。

3:js的变量声明:js的变量声明其实大体上可以分为三种:var声明、let与const声明和函数声明。

函数声明与其他声明一起出现的时候,是以谁为准呢?答案就是,函数声明高于一切,毕竟函数是js的第一公民。

所以下面函数的调用会输出谁呢? 答案是 foo

foo();function foo() {    console.log('foo');}
var foo = 2;

那么下面又会输出谁呢?

foo(); function foo() {    console.log('1');} function foo() {    console.log('2');}

答案是: 2因为有多个函数声明的时候,是由最后面的函数声明来替代前面的。

那下列程序优惠输出什么呢?

foo(); var foo = function() {    console.log('foo');}

答案是报了Uncaught TypeError: foo is not a function 的异常

例3:

function c(){var b=2    function a(){         console.log(b); // undefind         var b=3         console.log(b); // 3   }   a()   console.log(b); // 2 }c()