第七章 7.1 定义,调用函数(Defining and Invoking Functions)

函数可以有 return 语句也可以没有。如果没有,则调用者得到 undefined 的返回值。

关于参数的个数

如果传递参数比实际的多,则后面的被忽略。如果少了,则不足的被赋 undefined 的默认值。

嵌套的函数(Nested Functions)

function 可以嵌套定义,但也不是什么地方都可以。一般限制必须在 global 代码里,或者 top-level function 代码里。不允许定义在循环或者 if 语句中。如果定义在另一个 function 中,则这个是特指用 function 语句定义的那种。下面还会提到有一种定义方法称之为 function literal. 因为 function literal 可能出现在 if 语句中,所以是不可以嵌套定义的。例子:

function hypotenuse(a, b) {
    
function square(x) {return x*x; }
    
return Math.sqrt(square(a) + square(b));
}

除了用 function 语句,还可以用 Function() constructor 来定义 function. 例子:

var f = new Function("x""y""return x*y;");

Function() 可以接受任意数目的参数。最后一个是函数体的语句定义,前面所有都被看作要定义的函数的参数。

注意 Function() 创建的函数并没有指明函数名。这种函数叫做 匿名函数(anonymous functions).

那么为什么要用 Function() 来定义函数呢?都用 function 语句定义不好吗?
主要是因为 Function() 允许我们动态的创建和编译函数,这样比较灵活。还有一个不太重要的原因是,Function() constructor 必须在函数每次被调用的时候重新编译该函数。所以一般不要在循环里面,或者很常用的函数里这样定义,否则可能带来较大的开销。

Function Literals

var f = function(x) { return x * x; };

function literal 可以是匿名的,也可以是有名字的。这在需要递归调用的情况下很有用:

var f = function fact(x) { if (x <= 1return 1else return x*fact(x-1); }; 

注意,这种有名字的 literal function 在 JavaScript 1.5 之前是没有实现的。
他其实并不是创建了一个叫做 fact 的 function. 本质上还是匿名函数,但是它允许该函数体中用这个名称来引用自己。
这种方式定义的函数特别适用于只需要定义一次,而不需要命名的情况。甚至可以直接立刻调用:

a[0= function(x) { return x*x; };  // Define a function and store it
a.sort(function(a,b){return a-b;});  // Define a function; pass it to another
var tensquared = (function(x) {return x*x;})(10);  // Define and invoke

function literals 和 Function constructor 其中一个不同的地方在于,它只需要编译一次。

posted on 2005-04-22 14:05  NeilChen  阅读(859)  评论(4编辑  收藏  举报

导航