函数可以用来结构化大段程序;减少重复;为子程序命名,将子程序彼此分开。
编程语言有越多预先精确定义的函数,灵活性就越低,所以需要程序员自己编写函数而不是语言作者内置越多的函数就越好。
定义函数
关键字function,可选的参数,必不可少的花括号。有些函数可以返回值,有些则没有,他们只产生side effect。
return 关键字会立刻跳出函数,将表达式返回给函数调用的代码,如果return后面没有表达式则返回undefined。
var makeNoise = function() {
console.log("Pling!");
};
makeNoise();
// → Pling!
var power = function(base, exponent) {
var result = 1;
for (var count = 0; count < exponent; count++)
result *= base;
return result;
};
console.log(power(2, 10));
// → 1024
参数与作用域
参数就像普通变量,只是他们的值由调用函数的代码赋予,不是函数本身。
函数最重要的特性是,所有在函数内部声明的变量和他们的参数都是局部变量,局部变量在每次函数调用时都会被创建,并且这些“化身"不会彼此干扰。上例中,power内部的result变量,每次调用都会被创建。
相反,在函数外部声明的变量是全局变量,他们可以被整个程序包括函数内部访问到,只要函数内部没有同名的局部变量。
var x = "outside";
var f1 = function() {
var x = "inside f1";
};
f1();
console.log(x);
// → outside
var f2 = function() {
x = "inside f2";
};
f2();
console.log(x);
// → inside f2
上面的代码定义并且调用了2个函数,f1函数内部声明了一个局部变量x,它修改的是局部变量x。f2函数没有声明局部变量,所以函数内部的x引用的是全局变量x。
嵌套的作用域
javascript可以在函数内部创建函数,这产生了作用域的嵌套。
var landscape = function() {
var result = "";
var flat = function(size) {
for (var count = 0; count < size; count++)
result += "_";
};
var mountain = function(size) {
result += "/";
for (var count = 0; count < size; count++)
result += "'";
result += "\\";
};
flat(3);
mountain(4);
flat(6);
mountain(1);
flat(1);
return result;
};
console.log(landscape());
// → ___/''''\______/'\_
fl