js 预编译做了哪些工作呢?

来源:互联网 发布:宋家三姐妹知乎 编辑:程序博客网 时间:2024/05/21 11:29

首先要说明的,下面这种方式是对的,虽然不知道为什么,很奇怪为什么可以先使用,再定义,希望有了解的人可以给个说法.
    <SCRIPT LANGUAGE="JavaScript">
    hello('www.openj.cn');

      function hello(name){alert("hello " +name)};   

    </SCRIPT>

本文首发于 http://blog.openj.cn

下面的这种定义函数方式,对于写一些比较复杂的代码比较合适,特别是有返回值时,函数名可以直接被赋予返回值,有时这会带来很大的方便.
    <SCRIPT LANGUAGE="JavaScript">
     var hello = function(name){alert("hello "+name)};
      hello('www.openj.cn');

    </SCRIPT> 

下面这种方式是错的,在此处不能先使用后定义,可能是因为函数名此时也当做变量名吧.对变量无法实现先使用后定义.这只是猜测,希望有明白人能给一个权威说话.
  <SCRIPT LANGUAGE="JavaScript">

  hello('www.openj.cn');
     var hello = function(name){alert("hello "+name)};

    </SCRIPT> 

javascript执行时,先预编译,再解释执行. 
预编译过程: 
首先为执行环境建立建立一个全局对象,一般客户端脚本为window或global对象。 
  然后,检查某环境中根代码块中(非函数或{}中)var关键字,把这些变量设置成global对象的属性,并附初值undefined. 
如果过程中遇到直接定义的函数(fun1的定义),那么把fun1设置成global对象的属性,并附初值函数的定义. 
接下来才是解释执行过程,也就是页面上的js的顺序执行过程. 

var hello = function(){...},在解释执行过程才会把函数指针赋值给hello,在它之前hello是undefined. 
而function hello(){...}定义的之所以可以,因为它是在预编译过程中,已经定义了hello这个变量.




var theName = (function(){

    var _surname = function(){
        return "xiong";
    },
    _name = function(){
        return "zhengxiang";
    }; 
    console.log(theName.getSurname());
    return {
     getSurname : _surname,
     getName : _name
   }

})();


参考:http://www.blogjava.net/zkjbeyond/archive/2006/04/06/39514.html

http://www.blogjava.net/itspy/archive/2007/10/29/156752.html

       

原创粉丝点击