javascript变量声明全局变量区别详解

发布时间:2020-02-21编辑:脚本学堂
有关javascript变量声明的方法,隐式全局变量与明确定义的全局变量有什么区别,javascript有隐含的全局概念,意味着不声明的任何变量都会成为一个全局对象属性。

javascript变量声明,隐式全局变量与明确定义的全局变量的区别。

定义在函数体外的都属于全局变量,定义在函数体内的属于局部变量。
这里定义是指通过var声明的。

javascript有隐含的全局概念,意味着不声明的任何变量都会成为一个全局对象属性。

例如:
 

复制代码 代码示例:
function test(){
    myname = "huming";
    alert(myname);
}
 
test();  // "huming"
alert(myname);  //"huming"
 

两个结果一样,说明myname是一个全局变量。

隐式全局变量与明确定义的全局变量有什么区别?

来看例子:
 

复制代码 代码示例:
// 定义三个全局变量
var global_test1 = 1;
global_test2 = 2; // 反面教材
(function () {
    global_test3 = 3; // 反面教材
}());
 
//试图删除
delete global_test1; // false
delete global_test2; // true
delete global_test3; // true
 
//测试该删除
alert(typeof global_test1); // "number"
alert(typeof global_test2); // "undefined"
alert(typeof global_test3); // "undefined"

由以上例子可以看出:
在函数之外通过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...
}

优势在于:
1、所有局部变量都定义在函数开始,方便查找;
2、防止变量在定义之前使用的逻辑错误。