函数
函数:
函数的声明: “function”是关键字。
1.1
// 函数的声明
function test(){
//方法体
}
1.2
//函数的表达式 也叫匿名函数
注:采用函数表达式声明函数时,function命令后面不带有函数名。
var test = function() {
//方法体
}
1.3
//函数的重复声明
如果多次采用function命令,重复声明同一个函数,则后面的声明会覆盖前面的声明。
function f(){
console.log(1);
}
f(); // 2
function f(){
console.log(2);
}
f(); // 2
2.形式参数和return语句
调用函数时,要使用圆括号运算符。圆括号之中,可以加入函数的参数。
function add(x,y) { return x+y; } add(1,1) // 2
3. 立即调用的函数表达式(IIFE(Immediately-Invoked Function Expression))
有时,我们需要在定义函数之后,立即调用该函数。这时,你不能在函数的定义之后加上圆括号,这会产生语法错误。产生这个错误的原因是,Javascript引擎看到function关键字之后,认为后面跟的是函数定义语句,不应该以圆括号结尾。
function(){ /* code */ }();
// SyntaxError: Unexpected token (
解决方法: 圆括号前面的部分不是函数定义语句,而是一个表达式,可以对此进行运算。
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();
注意,上面的两种写法的结尾,都必须加上分号。
4. 第一等公民
JavaScript的函数与其他数据类型处于同等地位,可以使用其他数据类型的地方就能使用函数。比如,可以把函数赋值给变量和对象的属性,也可以当作参数传入其他函数,或者作为函数的结果返回。这表示函数与其他数据类型的地方是平等,所以又称函数为第一等公民。
function add(x, y) {
return x + y;
}
// 将函数赋值给一个变量
var fn = add;
console.log(fn(1, 2));
// 将函数作为参数和返回值
function operator(fn) {
return fn;
}
console.log(operator(add)(1, 2));
5. 函数名的提升
JavaScript引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会被提升到代码头部。所以,下面的代码不会报错。
var sum = add(1, 2);
console.log(sum);
function add(x, y) {
return x + y;
}
表面上,上面代码好像在声明之前就调用了函数add。但是实际上,由于“变量提升”,函数f被提升到了代码头部,也就是在调用之前已经声明了。但是,如果采用赋值语句定义函数,JavaScript就会报错。
var sum = add(1, 2);
console.log(sum);
var add = function (x, y) {
return x + y;
}
//Uncaught TypeError: add is not a function
5. 函数名的提升
JavaScript引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会被提升到代码头部。所以,下面的代码不会报错。
var sum = add(1, 2);
console.log(sum);
function add(x, y) {
return x + y;
}
表面上,上面代码好像在声明之前就调用了函数add。但是实际上,由于“变量提升”,函数f被提升到了代码头部,也就是在调用之前已经声明了。但是,如果采用赋值语句定义函数,JavaScript就会报错。
var sum = add(1, 2);
console.log(sum);
var add = function (x, y) {
return x + y;
}
//Uncaught TypeError: add is not a function
如果同时采用function命令和赋值语句声明同一个函数,最后总是采用赋值语句的定义。
var fn = function() {
console.log ("1");
};
function fn() {
console.log("2");
}
fn();
// 1
6. 函数的属性和方法
6.1 name属性:返回紧跟在function关键字之后的那个函数名。
function fn1() {}
console.log(fn1.name);
var fn2 = function() {};
console.log(fn2.name);
var fn3 = function fn3() {};
console.log(fn3.name);
6.2 length属性:返回函数定义中参数的个数。
function fn(x, y) {}
console.log(fn.length);
7.arguments对象
1) 由于JavaScript允许函数有不定数目的参数,所以我们需要一种机制,可以在函数体内部读取所有参数。这就是arguments对象的由来。
2)arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,依次类推。这个对象只有在函数体内部,才可以使用。
3)可以通过arguments对象的length属性,判断函数调用时到底带几个参数。