zoukankan      html  css  js  c++  java
  • javascript深度剖析之 【 var 关键字】。

    javascript中的var关键字,作用很简单。用于声明一个变量。如果不给声明的变量赋值则为undefined.

    var test = 'test'; var t;

    此时test值为,'test', t 的值为undefinde. 

    似乎很简单,并没有什么特殊的地方。只要学过js的,都知道。

    那么请看下面这段代码的执行结果。

    console.log(test);
    
    var test = 'test';
    
    console.log(test);

    这样先输出了undefunde 然后输出了test。很奇怪吧。相信很多朋友会以为会产生错误。

    因为我们在输出test时,它还未被定义。结果应该像输出一个未定义的变量那样被抛出错误才对。可是事实却并非如此。

    这是为什么呢,原来JS在解析时var 会被预先解析。也就是说,这段代码的实际运行效果是这样的。

    var test;
    
    console.log(test);
    
    test = 'test';
    
    console.log(test);

    这样一来就清晰多了吧,相信大家应该都能看明白。

    接下来我们看一个复杂点的。

    var test = 'test';
    
    console.log(test); //1
    
    function fn(){
    
      console.log(test);//2
    
      var test = 'function test';
    
      console.log(test);//3
    }
    
    fn();
    
    console.log(test); //4

    上面这段代码,会依次输出。

    1.test

    2.undefined

    3.function test

    4.test

    相信这个大家都明白,原理与上面一样。

    函数内部被解析为 

    var test;   //定义test 
    
    console.log(test); //输出test,值为undefined,因为当前环境内存在test,不在作用域链中向上查找test, 故此输出undefined
    
    test = 'function test'; //  给test赋值为 'function test'.
    
    console.log(test); //输出test ,值为function test;

    我们在看一个例子

    console.log(test);
    
    var test = 'test';
    
    function test(){}
    
    console.log(test);

    函数与变量同名的情况,当然。这种情况实际开发中几乎不会遇到。

    上面这个例子会输出 function test(){} 然后输出 'test', 原因是因为funciton会比var先解析。  

    而在javascript中,函数是对象,函数名却是一个变量(变量里保存的是函数的引用)。

    所以在在遇到第一次输出test时,输出的不是undefined 而是将函数输出。

    后面的执行过程大家应该都清楚了。 

    我们最后在看一个例子,

    function fn(){
      test = 'bbb';
      var test = 'ccc';
      console.log(test);
    }
    
    fn();
    
    console.log(test);

    按照正常思路,似乎会输出ccc,然后输出bbb。因为test 前面没有var 此时它代表全局变量。 

    然而很不幸的是,会先输出'ccc'然后抛出一个错误.原因是test不存在。

    原因是什么呢,很简单。因为fn内部解析过程是这样的。

    var test;
    
    test = 'bbb';
    
    test = 'ccc';  

    故此test = bbb 实际是对函数内部的test 进行操作。 

    由此上例子我们可以的到一个结论,在js中调用可以在定义前面的,不止是function;变量也可以,见下例;

    function fn(){
      test = 'ttt';
      alert(test);  
      return;   
      var test; //此定义会被解析到赋值语句之前,故此上面的test 是函数内部变量。 }

    此时的test依旧是函数内部变量。

    以上便是var的关键字的一些特性,如有错误或遗漏之处。欢迎指出。

  • 相关阅读:
    BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)
    BZOJ-3670 动物园 KMP+奇怪的东西
    3172
    BZOJ-3668 起床困难综合症 位运算+贪心
    BZOJ-2257 瓶子和燃料 分解因数+数论方面乱搞(裴蜀定理)
    BZOJ-1013 球形空间产生器sphere 高斯消元+数论推公式
    BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元
    BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘
    BZOJ-1705 Longge的问题 一维GCD SUM 乱搞+质因数分解+...
    BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
  • 原文地址:https://www.cnblogs.com/lynxcat/p/2490129.html
Copyright © 2011-2022 走看看