javascript中的var

var的反作用

隐式全局变量和明肯定义的全局变量间有些小的差别,就是经过delete操做符让变量未定义的能力。函数

  • 经过var建立的全局变量(任何函数以外的程序中建立)是不能被删除的。
  • 无var建立的隐式全局变量(无视是否在函数中建立)是能被删除的。

这代表,在技术上,隐式全局变量并非真正的全局变量,但它们是全局对象的属性。属性是能够经过delete操做符删除的,而变量是不能的:测试

01 // 定义三个全局变量
02 var global_var = 1;
03 global_novar = 2;       // 反面教材
04 (function () {
05    global_fromfunc = 3; // 反面教材
06 }());
07  
08 // 试图删除
09 delete global_var;      // false
10 delete global_novar;    // true
11 delete global_fromfunc; // true
12  
13 // 测试该删除
14 typeof global_var;      // "number"
15 typeof global_novar;    // "undefined"
16 typeof global_fromfunc; // "undefined"

在ES5严格模式下,未声明的变量(如在前面的代码片断中的两个反面教材)工做时会抛出一个错误。spa

 

vars变量预解析

JavaScript中,你能够在函数的任何位置声明多个var语句,而且它们就好像是在函数顶部声明同样发挥做用,这种行为称为 hoisting(悬置/置顶解析/预解析)。当你使用了一个变量,而后不久在函数中又从新声明的话,就可能产生逻辑错误。对于JavaScript,只要你的变量是在同一个做用域中(同一函数),它都被当作是声明的,即便是它在var声明前使用的时候。看下面这个例子:code

1 // 反例
2 myname = "global"// 全局变量
3 function func() {
4     alert(myname); // "undefined"
5     var myname = "local";
6     alert(myname); // "local"
7 }
8 func();

在这个例子中,你可能会觉得第一个alert弹出的是”global”,第二个弹出”loacl”。这种期许是能够理解的,由于在第一个alert 的时候,myname未声明,此时函数确定很天然而然地看全局变量myname,可是,实际上并非这么工做的。第一个alert会弹 出”undefined”是由于myname被当作了函数的局部变量(尽管是以后声明的),全部的变量声明当被悬置到函数的顶部了。所以,为了不这种混乱,最好是预先声明你想使用的所有变量。对象

上面的代码片断执行的行为可能就像下面这样:baip

1 myname = "global"// global variable
2 function func() {
3    var myname; // 等同于 -> var myname = undefined;
4    alert(myname); // "undefined"
5    myname = "local";
6    alert(myname); // "local"}
7 func();

为了完整,咱们再提一提执行层面的稍微复杂点的东西。代码处理分两个阶段,第一阶段是变量,函数声明,以及正常格式的参数建立,这是一个解析和进入上下文 的阶段。第二个阶段是代码执行,函数表达式和不合格的标识符(为声明的变量)被建立。可是,出于实用的目的,咱们就采用了”hoisting”这个概念, 这种ECMAScript标准中并未定义,一般用来描述行为。作用域

相关文章
相关标签/搜索