函数声明
-
function
关键字,函数名称,函数定义 - 可以先使用,再定义,有提升功能
- 没有重载,定义相同函数名、不同参数签名的函数,后面的函数会覆盖前面的函数。调用时,只会调用后面的函数。
- 这是最传统的使用方式,推荐使用
- 函数定义的
{}
后面不要有;
这仅仅是定义,不是执行;执行语句的()
后面可以有;
=== 区分定义和使用
console.log(square(5));
/* ... */
function square(n) {
return n*n;
} // 这里不要有;只是定义,不是执行
函数表达式
- 函数可以用表达式的方法赋值给一个变量
- 可以省略函数名,以后用变量名调用
- 表达式
{}
后面要有;
- 需要先定义再使用,没有提升功能
var square = function(number) {
return number * number
}; // 这里有;
var x = square(4); // x得到的值为16
- 也可以提供函数名,并且可以用于在函数内部代指其本身,或者在调试器堆栈跟踪中识别该函数,可以用在递归调用中,比较方便
var factorial = function fac(n) {return n<2 ? 1 : n*fac(n-1)};
console.log(factorial(9));
- 函数变量可以作为其他函数的参数,这种方式推荐使用,比如模拟
map
的实现:
function map(f,a) {
var result = [];// 创建一个新的数组
for (var i = 0; i != a.length; i++) {
result[i] = f(a[i]);
}
return result;
}
var f = function(x) {
return x * x * x
};
var a = [0, 1, 2, 5, 10];
var b = map(f, a); // b = [0, 1, 8, 125, 1000]; a = [0, 1, 2, 5, 10];
自调用函数
- 没有函数名
- 也不赋值给一个变量
- 定义用
()
包起来,后面紧跟着()
,定义后马山执行 - 用在只执行一次的场景。
(function () {
var x = "Hello!!"; // 我将调用自己
alert(x);
})();
闭包
- 假设,函数A内部声明了个函数B,函数B引用了函数B之外的变量,并且函数A的返回值为函数B的引用。那么函数B就是闭包函数。
- 通常用在对的
getter
和setter
函数
var createPet = function(name) {
var sex;
return {
setName: function(newName) {
name = newName;
},
getName: function() {
return name;
},
getSex: function() {
return sex;
},
setSex: function(newSex) {
if(typeof newSex == "string"
&& (newSex.toLowerCase() == "male" || newSex.toLowerCase() == "female")) {
sex = newSex;
}
}
}
}
var pet = createPet("Vivie");
pet.getName(); // Vivie
pet.setName("Oliver");
pet.setSex("male");
pet.getSex(); // male
pet.getName(); // Oliver
使用arguments
对象
函数的实际参数会被保存在一个类似数组的arguments
对象中。在函数内,可以通过arguments[i]
找出传入的参数。比如,模仿数组的join
函数实现:
function myConcat(separator) {
var result = ""; // initialize list
// iterate through arguments
for (var i = 1; i < arguments.length; i++) { // 0 是separator
result += arguments[i] + separator;
}
return result;
}
// returns "red, orange, blue, "
myConcat(", ", "red", "orange", "blue");
// returns "elephant; giraffe; lion; cheetah; "
myConcat("; ", "elephant", "giraffe", "lion", "cheetah");
// returns "sage. basil. oregano. pepper. parsley. "
myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");
网友评论