javascript 变量声明 和 作用域
变量的声明
1.变量声明具有提升机制,Javascript在执行时,会把所有的声明都提升到当前作用域前面。
先看一下下面的例子:
(function(){
alert(b)//b is not defined
alert(a); //undefined
var a = 200;
})()
运行的结果分别是:b is not defined ; undefined
分析: 变量a的声明被提前,所以最初代码相当于:
(function(){
var a;//声明变量a
alert(b)//b is not defined
alert(a); //undefined
a = 200; //(定义并)初始化变量a
})()
b不用解释,因为找不到b,所以会报错。a是应为声明被提前了,所以可以找到a,但变量a并没有赋值,所以会输出undefined.
作用域:(全局作用域、函数作用域、eval作用域、ES6块级作用域)
1. 函数体内部,局部变量的优先级比同名的全局变量优先级高。
var a = 100; (function(){ alert(a)//undefined var a = 200; alert(a)//200 })()
运行上面的例子可以输出: undefined;200。
分析:第一个alert为什么会是undefined呢?这里有变量的两个知识点:第一个是变量声明会提前,第二个就是局部变量的优先级比同名全局变量优先级高。上面的代码相当于:
var a = 100; (function(){ var a; alert(a)//undefined a = 200; alert(a)//200 })()
在函数作用域内,变量a的声明被提前了,函数外全局变量a被函数内变量a覆盖。所以会输出undefined;第二个输出200是因为a=200被赋值的原因。
2. ECMA2015 没有块级作用域,只有函数作用域和全局作用域 (ECMA2016 引入块级作用域)
var a = 100; if(true){ alert(a);//100 var a = 200; alert(a);//100 }
上面代码输出结果为:100,200。说明javascript是没有块级作用域的。javasctipt中唯一拥有作用域的结构的是函数function
综上:下面的代码的输出结果就好理解了
var a = 100; var b = 200; function test(){ alert(a); //undefined alert(b); //200 b = 300; alert(b); //300 var a = 1; alert(a); //1 } test();