zoukankan      html  css  js  c++  java
  • js变量声明与赋值以及函数声明

    if (!("a" in window)) {

       var a = 1; }

    alert(a);

    结果:undefined

    分析: 首先,所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1;

        第二,所有的变量声明都在范围作用域的顶部,如:

      alert("a" in window);

      var a;

    相当于:

      var a;

      alert("a" in window);

    这是因为JavaScript引擎首先会扫墓所有的变量声明,然后将这些变量声明移动到顶部。

        第三,你需要理解该题目的意思是,变量声明被提前了,但变量赋值没有,因为这行代码包括了变量声明和变量赋值。

           当变量声明和赋值在一起用的时候,JavaScript引擎会自动将它分为两部以便将变量声明提前,不将赋值的步骤提前是因为他有可能影响代码执行出不可预期的结果。

    所以上面的代码就相当于:

      var a;

      if (!("a" in window)) { 为false

       a = 1; }

      alert(a); 所以为undefined

    例子2:

      var num = 100;
        function fn(){
          var num = num + 1;  //var num=window.num+1;正确,此时才外外面的全局变量num
          return num;
        }
    falert(n());答案是NaN

      因为在函数体内部首先把var num提前,这样在赋值的时候去的num + 1中的值是undefined,这样进行运算后答案就是NaN,

      记住我们找对象的时候是层级往上面找的,找不到才找外面的。

    例子3:

    var b = (function(){
          function fn(){
              return 1;
          }
        return fn();
          function fn(){
              return 2;
        }
        var fn;
        fn = 3
        })();
    alert(b);答案是2,

    因为首先把var fn提前,然后函数体那样子定义也是一种函数的声明(需要提前),并且同名函数后面覆盖前面的,所以就是var ,fn,fn,然后就renturn了,没有走之后的fn=3,所以答案就是2

    代码等价于:

      var b = (function(){

          var fn;
          function fn(){
              return 2;
          }
        return fn();    
        fn = 3
        })();

    所以输出2

  • 相关阅读:
    从属性赋值到MVVM模式详解
    C#综合揭秘——细说事务
    Action与Trigger
    C#综合揭秘——细说多线程(下)
    继承BitmapSource并使用独立存储来缓存远程的图片
    Windows Phone 7 MVVM模式数据绑定和传递参数
    Lambda表达式总结
    Windows Phone页面导航和独立存储开发总结
    RegisterHotKey设置系统级热键《转》
    隐藏统计代码或者任何不想被看见的东西《转》
  • 原文地址:https://www.cnblogs.com/jiechn/p/4140095.html
Copyright © 2011-2022 走看看