JavaScript变量的声明

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


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


  1. function test(){
  2.     myname = "huming";
  3.     alert(myname);
  4. }

  5. test();  // "huming"
  6. alert(myname);  //"huming"
复制代码
两个结果是一样的,说明myname是一个全局变量。


那么,隐式全局变量和明确定义的全局变量有没有区别呢。。答案肯定是有的,看下面的例子:


  1. // 定义三个全局变量
  2. var global_test1 = 1;
  3. global_test2 = 2; // 反面教材
  4. (function () {
  5.     global_test3 = 3; // 反面教材
  6. }());

  7. // 试图删除
  8. delete global_test1; // false
  9. delete global_test2; // true
  10. delete global_test3; // true

  11. // 测试该删除
  12. alert(typeof global_test1); // "number"
  13. alert(typeof global_test2); // "undefined"
  14. alert(typeof global_test3); // "undefined"
复制代码


由上面的例子可以看出:在函数之外通过var定义的global_test1不能被删除,而没有经过var定义的global_test2和global_test3都被删除了(无论是否是在函数体内创建)。


总结来说,在函数体外通过var声明的全局变量不能被删除,而隐式全局变量是可以删除的。


这里要注意了:JavaScript有一种行为叫做“hoisting”(悬置/置顶解析/预解析)。


我们通过一个例子来说明:


  1. var myname = "huming"; //声明全局变量
  2. function test() {
  3.     alert(myname);
  4.     var myname = "local_huming";
  5.     alert(myname);
  6. }
  7. test();
复制代码



你猜两次alert的内容一致吗??显然不一致,一致还用说吗。。实际输出是:"undefined", "local_huming"。


上面的例子等同于


  1. var myname = "huming"; //声明全局变量
  2. function test() {
  3.   var myname;
  4.   alert(maname);<br>  myname = "local_huming";
  5.   alert(myname);    // "local"
  6. }
  7. test();
复制代码


第一次alert输出的myname并不是你以为的全局变量,而是和它在一个作用域(一个函数体)内的局部变量。虽然它还没有被声明,但被当作是声明了。这就是所谓的“hoisting”。


这样应该就明白了吧。当你在函数体中使用了一个变量,又在之后重新声明的话,就可能产生错误。


书写规范:


  1. function test() {
  2.    var a = 1,
  3.        b = 2,
  4.        c = a + b,
  5.        d = {},
  6.        e,
  7.        f;
  8.    // function body...
  9. }
复制代码


好处在于:


1、所有局部变量都定义在函数开始,方便查找;


2、防止变量在定义之前使用的逻辑错误。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值