JavaScript 变量提升

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,所以这里会输出)








猜你喜欢

转载自blog.csdn.net/weixin_42075590/article/details/80622603