zoukankan      html  css  js  c++  java
  • JavaScript之周道长浅谈变量使用中的坑

    天空一声巨响,道长闪亮登场,飞花落叶,尘土飞扬,此处不应恐慌,用阅读变量的概念来提升气场。

    1)变量的声明,使用一个变量之前应该先声明。变量是使用关键字var来声明的,如下:

      var number;     //申明了一个变量

    2)变量的赋值,如下:

      number=520;   //给变量赋值(javascript中的变量是可以赋任意类型的值的,比如字符串,对象,函数等等)

    3)上面两个步骤可以合到一起,如下:

      var number=520;  //等价于前两步

    **有人会说 number=520;  即使没用var声明,变量一样的使用,其实是有区别的,这里就不做无意义的讨论了。

    **你只要记住,这是一个不好的习惯,应当始终使用var关键字来声明变量。

    故事就从这里开始了。

    看一段代码:

      if(!(n in window)){

                var n=100;    //注意这行代码等价于 var n; n=100;这两行代码

      }

      alert(n);

      alert(a);   

    这里, alert(n)会弹出undefined,     alert(a)会报错:a is not defined。

    弹出undefined的意思是n已经声明但是还没有赋值,报错是a没有声明,不存在。

    a报错好理解。这里我要解释为什么alert(n)会弹出undefined,而不是报错或者弹出100.

    其中的原理有点复杂。

    先来理解javascript的两个概念:作用域和声明提前。

    1 作用域:

    我们知道类似c语言,比如java的花括号都有自己的作用域。

    但是javascript 不同,它的if等花括号不算块级作用域(函数除外)。

    2 声明提前:

    变量的声明会被提前到作用域的顶部(意味着变量在申明之前就可以使用了,只要在作用域内)

    好吧,从 var n=100; 这一行代码说起,if的花括号关不住它的,所以n算全局变量.

    因为if的条件返回false,所以不会执行赋值的操作,不可能弹出100.

    而根据申明提前,javascript引擎的“预编译”是在代码开始运行之前执行的,

    它才不管if的条件是true还是false,

    它看到var关键字就把这个变量申明提到作用域第一行了,它就是这么任性。

    但是变量赋值就惨了,他说:if的条件是false,我永远不会被执行啦。

    javascript中声明过的变量如果没赋值就是undefined。

    而函数是有自己的作用域的,来一个例子加注释,如果你不能理解的话,那就不理解吧。

    这里声明了两个scope,一个是全局变量,一个是只能在函数中使用的局部变量。

    var scope="global";

    function f(){

      console.log(scope);

      var scope="local";//这里等价于两步 1:var scope; 2:scope="local"; 第一步由于声明提前在捣鬼,会把它提到函数第一行

      console.log(scope);

    }

    两次动作console.log(scope);都是在函数中打印scope变量的值。

    如果函数作用域中有了scope,两次都不会理睬外面声明的scoped。(局部作用域优先)

    所以第一次打印出undefined,第二次打印出local;

    道长叨叨:javascript全局变量是全局对象的属性,而局部变量没有这样规定,在扯下去一夜都叨叨不完了。

    道长的建议:函数里面的变量申明尽量放在函数体顶部,让代码更具可读性。

  • 相关阅读:
    hdu6162 Ch’s gift
    hdu 6166 Senior Pan
    bzoj2818 Gcd
    hdu6127 Hard challenge
    splay伸展树模板
    2016-2017 National Taiwan University World Final Team Selection Contest J
    2016-2017 National Taiwan University World Final Team Selection Contest C
    使用powershell管理域用户
    EGL Driver message (Critical) eglInitialize: No available renderers.
    Python实现telnet命令测试防火墙
  • 原文地址:https://www.cnblogs.com/zhoudaozhang/p/javascript.html
Copyright © 2011-2022 走看看