JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
在JS严格模式下:
(1)变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
"use strict"; j = 2; console.log(j); var j;
(2)JavaScript 只有声明的变量会提升,初始化的不会。
j = 2; console.log(j); var j=3;(3)i 输出了 undefined ,变量 i 没有被声明,所以 i 是一个未定义的变量。
j = 2; i = 1; console.log(j+i); //i is not defined var j=7;
(4)返回NaN,即非数值(Not a Number)是一个特殊的值,这个数值表示本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了).变量 i 声明了但未赋值就参与了运算
j = 2; console.log(j+i); //NaN var j=7; var i=1;
理解 js 的解析机制:
遇到 script 标签的话 js 就进行预解析,将变量 var 和 function 声明提升,但不会执行 function,然后就进入上下文执行,上下文执行还是执行预解析同样操作,直到没有 var 和function,就开始执行上下文。
二、方法中变量提升案例
js中定义变量有两种情况:(注意在方法外不加var是不能定义变量的,出现xx is not defined)
1. 都加var,在方法内则是局部变量,在方法外则是全局变量。
2. 在方法内,加var为局部变量,不加var则是全局变量(在执行当前方法之后)
var a = 'I\'m a in all' function test1 () { console.log(a)// undefined console.log(window.a)//I'm a in all(因为window指的是全局环境) var a = 'I\'m a in test1' console.log(a) // I'm a in test1 } test1()
var a = 'I\'m a in all' function test2 () { console.log(a) // I'm a in all a = 'I\'m a in test2' // 这里本来就是赋值,所以上边的a会输出全局变量 console.log(a) // I'm a in test2 } test2()
function test3 () { console.log(a) // 报错(Uncaught ReferenceError: a is not defined) a = 'I\'m a in test3' // 这里本来就是赋值,所以上边的a会输出全局变量 console.log(a) // I'm a in test3 } test3() console.log(2) // I'm a in test3(本来没有全局变量a,当test3运行时,定义了一个全局变量a,所以这里会输出)