函数调用
函数的调用和C中差不多,但形式可能有点不同。JavaScript的函数调用形式为:(函数)(参数列表)或者函数名(参数列表)。后者和C是一样的,但前者和C是迥然不同的,因为C中函数声明和函数调用是区分开的。先来看下例子:
- function add(num1, num2) {
- return num1 + num2;
- }
- var a = add(1, 2);
这种方式就是函数名(参数列表)的形式,我们在C中经常见到,就不详细说了,我们可以把上面那个换种形式来展现:
- var a = (function add(num1, num2) {
- return num1 + num2;
- })(1, 2);
- console.log(a);
这样我们就能实现声明和执行一块处理。
但是这样有个问题,我们再看一种情况:
- var a = (function add(num1, num2) {
- return num1 + num2;
- })(1, 2);
- var b = add(1, 2);
- console.log(a);
- console.log(b);
这是因为add这个变量的作用域仅限于括号内,这个在之后的作用域讲解中将讲到。
这样的调用,一般是在匿名函数中,为了让函数立即执行才使用这种方式,又或者,利用它的不足,利用JavaScript的作用域特点,将函数内的变量全部转为局部变量,达到封装和防止污染全局的目的。
函数嵌套
JavaScript的函数理论上是可以无限嵌套的,当然并不推荐嵌套太多,原因有很多,无论是性能还是代码简洁要求,都要求不应该嵌套太多。我们举一个嵌套的例子:
- function getAbs(num) {
- function isNegative(num) {
- return num < 0;
- }
- return isNegative(num) ? -num : num;
- }
- var a = getAbs(-1);
记住一句话,有嵌套就有父子关系(相互嵌套的不在参考范围内,也极度不推荐)。在上面的例子中,父函数即为getAbs,子函数为isNegative。
在JavaScript的嵌套中,涉及到作用域的问题,我们先不讲太复杂的,简单的可以记成:父函数中声明的所有变量,或者说,父函数中能使用的变量,都能在子函数中使用,但反过来,子函数中显式声明的所有变量,都不能在父函数中使用。后面会讲到caller和callee来帮助理解嵌套。