首先要说明的,下面这种方式是对的,虽然不知道为什么,很奇怪为什么可以先使用,再定义,希望有了解的人可以给个说法.
<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>
预编译过程:
首先为执行环境建立建立一个全局对象,一般客户端脚本为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