javascript具名函数和匿名函数作用域

刚刚学习javascript有些不懂,看书上有写如下js代码:
hello(); //此处可以访问到hello()函数
hello1(); //此处访问不到hello1()函数
function hello(){ alert("Hello!"); }
var hello1 = function() { alert("Hello1!"); };

书上的解释我也能明白,具名函数的作用范围是全局的,你可以在定义之前使用这个函数。但是匿名函数的定义是后向的,像C/C++一样,必须在定义之后才能使用。
可是为什么当我在Firebug上实验的时候,竟然都不能访问到,而且提示“ReferenceError: hello is not defined”?是Firebug的问题么?还是我理解的不对?

这个解释是对的,比如C++/Java都是一样的 不能向后引用 变量
hello1仅仅是个变量。
不知道你怎么测试的 把测试代码发上来测试下。

Javascript匿名的函数通过不带函数名的function关键字定义,例如:function(){alert("Test");}。匿名函数作用很大,可以在很多地方使用,并且可以简化编程,提高编程效率和可读性。但在创建匿名函数式有时候会遇到变量作用域的问题,下面做一下详细讲解。

var anonymousFunction1 = null;

var anonymousFunction2 = null;

var anonymousFunction3 = null;

var ClassTest = function () {

this.name = "derek";

var s = this;

this.s = this;

anonymousFunction1 = function() {

alert(this.name);

};

anonymousFunction2 = function() {

alert(s.name);

};

anonymousFunction3 = function() {

alert(this.s.name);

};

//anonymousFunction1(); //即使将anonymousFunction1();放与这里运行,仍然不会显示正确结果。

//s = null;//如果这里将s赋值为空,anonymousFunction2会执行出错,因为anonymousFunction2绑定的对象被变为null了。

};

new ClassTest();

anonymousFunction1();

anonymousFunction2();//anonymousFunction2包含了s的正确对象引用,所以会正确显示结果

//anonymousFunction3();//执行会出错,因为无法正确解析this

这段代码运行的结果就是,第一个弹出空窗体,第二个弹出内容。

第一个弹出空窗体,是因为this是方法运行时动态绑定到的对象,在这里这个匿名方法不属于任何对象,所以无法获取争取的this值,从而无法正确显示name。为什么第二个又可以了呢,因为s值被保存在了anonymousFunction2 的执行上下文中,它在运行中查找变量s就行了,由于s是保存在当前执行上下文中的,所以运行不会出错。即使创建anonymousFunction2后将s赋值为空,仍然会使anonymousFunction2失效。

总结来说比较稳妥的方法是使用一个专门的函数来绑定执行上下文,用函数的参数来充当绑定变量(类似上面var s)的作用。

function createDelegate(func,context) {

return function() {

func.apply(context);

}

}

这样参数func和context被传入后,就不会有机会被修改,返回的function对象是一个稳定的匿名方法。

当然还有其他方法实现类似功能,例如prototype库就是使用扩展Function类的方式来达到这样的目的。具体是增加bind方法到Function类,这样每个函数对象都会有这个方法,使用起来很方便。

:evil: