• 主题:javascript进阶之变量篇转载http://www.javaeye.com/topic/19506


    仔细的看了看<javascript权威指南>,算笔记吧
    1、关于变量的声名
    大家都知道javascript是可以隐式声名变量的。但要注意,隐式声名变量总是被创建为全局变量。看以下代码,情愿javascript语言强制声明变量。建议大家一定要var声明变量。
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. function test();{   
    3.     var a=222;   
    4.  document.writeln(a);;   
    5. }   
    6. test();;   
    7. document.writeln(a);;   
    8. </SCRIPT>  


    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. function test();{   
    3.     a=222;   
    4.  document.writeln(a);;   
    5. }   
    6. test();;   
    7. document.writeln(a);;   
    8. </SCRIPT>   
    2、关于变量的作用域
    猜猜以下代码输出什么。
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. var x='000';   
    3. document.writeln(x);;   
    4. a();;   
    5. function a();{   
    6.     var x='aaa';   
    7.  function b();{   
    8.      document.writeln(x);;   
    9.         var x='bbb';   
    10.   document.writeln(x);;   
    11.  }   
    12.  b();;   
    13.     document.writeln(x);;   
    14. }   
    15. </SCRIPT>  

    如果你的答案是   000 undefined bbb aaa。恭喜,ok.当代码用到x变量时,先从函数块(权威指南中用调用对象来解释)中找,如果找不到,从上一级函数块找,直到找到,如果知道顶层代码(指var x='000';的位置)还没找到定义,代码会报未定义错误。

    改一下代码,得到 000 undefined 111 111
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. var x='000';   
    3. document.writeln(x);;   
    4. a();;   
    5. function a();{   
    6.  function b();{   
    7.      document.writeln(x);;   
    8.   document.writeln(x);;   
    9.  }   
    10.  document.writeln(x);;   
    11.  var x='111';   
    12.  b();;    
    13. }   
    14. </SCRIPT>  

    3、新的问题
    变量个作用域清楚了,注意上面的代码。为什么我的function a()定义以前就可以调用a函数了,而我的var x='111';前“不可以用”x啊???
    让我把我的理解一一道来
    首先:以下代码让我相信javascript有个预编译过程,不是完全按照顺序解释执行的。
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. a();;   
    3. function a();{   
    4.     alert();;   
    5. }   
    6. </SCRIPT>  
     
    个人理解这个预编译过程不会象java/c#那样把代码编译成虚拟机认识的语言,更不会象vb,vc那样编译成更底层的语言。猜想只是把这个函数预装载到这段函数执行的全局环境中,在这个执行环境中,该函数被标识定义过,可以直接使用了。(看到网上很多人写的AOP的javascript实现,其实这个预编译过程才是翻译元数据最佳时候,可惜就javascript语言来讲,是有些落伍了)

    这个文章主要讲变量的一些问题。变量说了,为什么函数可以,我变量就不可以呢。
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. document.writeln(a);;   
    3. var a=0;   
    4. </SCRIPT>  

    为什么我要输出undefined呢?为什么我a就不可以预编译一把呢?
    大家看看以下两段代码会输出什么呢啊???
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. document.writeln(a);;   
    3. a=0;   
    4. </SCRIPT>  


    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. document.writeln(a);;   
    3. </SCRIPT>   


    可能你运行试了,可能你本来就知道,a未定义。哈哈哈,好了。
    现在我确信var a=0;被javascript解释器“预编译过”,至少是记录下来了。甚至把它的值设置为 undefined。“undefined”这个词名字取的很是让人误解,怎么能叫未定义呢,分明是javascript中所有变量的初始化值。关于null与undefined的比较我实在不愿提了。
    注意上面两段代码还反映一个现象。隐式声明的变量是在解释的时候才把自己定义为全局变量的。

    关于函数与变量javascript预编译的不同处理,大家可以与java class的加载过程比较下。java也是对基本类型设出值,对象为null的。(不往远扯了)
    4、区别未定义变量和未附值变量
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. var a;   
    3. document.writeln(a);;   
    4. </SCRIPT>  


    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. document.writeln(a);;   
    3. </SCRIPT>  

    未定义变量和未附值变量   权威指南中文版 定义的。通过第三条分析,我觉得变量就应该以   定义和未定义变量区别。未附值变量和undefined有点冲突,javascript不是强类型语言,没发附默认值,才来了个undefined。
    5、基本类型和引用类型
    熟悉java的朋友可能这部分很清楚。没啥
    说头。
    6、javascript的垃圾回收
    关于这部分内容一直没见着个权威说法。在javascript权威指南中有两小节提到这个问题。
    对于字符串、对象、数据这些没有固定大小,必须为它们动态的分配内存,但什么时候回收这些内存呢?javascript使用和java一样的garbage collection的方法。
    Java代码 复制代码
    1. var s="hello";   
    2. var u=s.toUpperCase();;   
    3. s=u;  

    运行这段代码后,"hello"没有变量会再用到他,这是"hello"的存储空间的被垃圾回收了。对于javascript的垃圾回收,你唯一要关心的是,它一定会进行,不要对内存担心。
    注意,javascript不提供任何的强制垃圾回收或释放内存的运算附或语句。
    javascript的delete运算附和C++中的不同。
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. var o=new Object();;   
    3. o.name="zkj";   
    4. o.age=25;   
    5. o.bir=new Date();;   
    6. for(var key in o);{   
    7. document.writeln(key+':'+o[key]+'</br>');;   
    8. }   
    9. document.writeln('delete o.bir</br>');;   
    10. delete o.bir;   
    11. for(var key in o);{   
    12. document.writeln(key+':'+o[key]+'</br>');;   
    13. }   
    14. </SCRIPT>  


    7、作为属性的变量
    猜猜以下代码会输出什么。
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. var x=100;   
    3. document.writeln(x);;   
    4. add(x);;   
    5. document.writeln('</br>------------------------</br>');;   
    6. var x=200;   
    7. document.writeln(x);;   
    8. add(x);;   
    9. function add(x);{   
    10.     document.writeln(x);;    
    11.     var x=300;   
    12.     document.writeln(x);;    
    13.     var x=400;   
    14.     document.writeln(x);;   
    15. }   
    16. </SCRIPT>  


    估计很多人能得出正确答案
    100 100 300 400
    ------------------------
    200 200 300 400
    但这里我想引入  全局对象和调用对象的 概念(javascript权威指南是这么翻译滴)
    Java代码 复制代码
    1. <SCRIPT LANGUAGE="JavaScript">   
    2. var x=100;   //我们在全局对象中加了个属性x. 对比   
    3.  //var o=new Object();;o.x=100;   
    4. document.writeln(this.x);;//用this访问全局对象   
    5. add(this.x);;//把全局对象的属性值传递对函数中   
    6. document.writeln('</br>------------------------</br>');;   
    7. this.x=200;//把全局变量中的x属性修改掉   
    8. document.writeln(window.x);;   
    9. add(window.x);;   
    10. function add(x);{   
    11.     //假设有个局部对象,调用对象,函数调用过程中的对象   
    12. //  temp   temp.x=${传入的值}   
    13.     document.writeln(x);; //哦这打印的可是参数中的值,也就是temp.x=this.x   
    14. //的值,   
    15.     var x=300;//把调用对象变量的签名给覆盖了.   
    16.     document.writeln(x);; //打印修改过的值。 temp.x   
    17.  var x=400;//temp.x=400   
    18.     document.writeln(x);;   
    19. }   
    20. </SCRIPT>  


    在函数的调用过程中,假设有个调用对象存在,把函数的参数,和函数内的临时变量当成这个调用对象的属性。当然这个调用对象的生命周期很短。
    注意,当我们访问全局变量的属性入x的时候,不必要用this.x 或window.x访问,当在有<frame><iframe>的页面时会出现混淆。
    关于函数的详细讨论我后续会详细讨论。
  • 相关阅读:
    全球覆盖 哈希
    陌上花开 模板 三维偏序
    洛谷 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
    熟练剖分(tree) 树形DP
    那一天她离我而去 二进制分组建图
    平凡的函数 线性筛积性函数
    wmz的数数(数状数组)
    跳一跳 概率与期望
    洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
    SpringBoot手动事务参考链接
  • 原文地址:https://www.cnblogs.com/si812cn/p/1409054.html
Copyright © 2020-2023  润新知