由上面的例子可以看出:在函数之外通过var定义的global_test1不能被删除,而没有经过var定义的global_test2和global_test3都被删除了(无论是否是在函数体内创建)。 总结来说,在函数体外通过var声明的全局变量不能被删除,而隐式全局变量是可以删除的。 这里要注意了:JavaScript有一种行为叫做“hoisting”(悬置/置顶解析/预解析)。 我们通过一个例子来说明: 复制代码 代码如下: var myname = "huming"; //声明全局变量 function test() { alert(myname); var myname = "local_huming"; alert(myname); } test();
你猜两次alert的内容一致吗??显然不一致,一致还用说吗。。实际输出是:"undefined", "local_huming"。 上面的例子等同于 复制代码 代码如下: var myname = "huming"; //声明全局变量 function test() { var myname; alert(maname);<br> myname = "local_huming"; alert(myname); // "local" } test();
第一次alert输出的myname并不是你以为的全局变量,而是和它在一个作用域(一个函数体)内的局部变量。虽然它还没有被声明,但被当作是声明了。这就是所谓的“hoisting”。 这样应该就明白了吧。当你在函数体中使用了一个变量,又在之后重新声明的话,就可能产生错误。 书写规范: 复制代码 代码如下: function test() { var a = 1, b = 2, c = a + b, d = {}, e, f; // function body... }