函数可以有多个参数,可以不传参数,参数个数可以大于定义的参数数量。
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
abs(10, ‘blablabla’); // 返回10
abs(-9, ‘haha’, ‘hehe’, null); // 返回9
//此时abs(x)函数的参数x将收到undefined,计算结果为NaN
abs(); // 返回NaN
arguments 代表传入的所有参数,类似 Array。
function foo(x) {
console.log('x = ' + x); // 10
for (var i=0; i<arguments.length; i++) {
console.log('arg ' + i + ' = ' + arguments[i]); // 10, 20, 30
}
}
foo(10, 20, 30);
rest参数
function foo(a, b, ...rest) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 结果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]
foo(1);
// 结果:
// a = 1
// b = undefined
// Array []
var sum=(...rest) => {
var sum =0;
rest.forEach(
(element, index, array) =>{
sum += element;
}
)
return sum;
}
sum(1,2,3,4,5,6,7,8,9,10);
函数嵌套
'use strict';
function foo() {
var x = 1;
function bar() {
var y = x + 1; // bar可以访问foo的变量x!
}
var z = y + 1; // ReferenceError! foo不可以访问bar的变量y!
}
JavaScript的函数在查找变量时从自身函数定义开始,从“内”向“外”查找。如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量
变量提升
'use strict';
function foo() {
var x = 'Hello, ' + y;
console.log(x);
var y = 'Bob';
}
foo();
console.log显示Hello, undefined,说明变量y的值为undefined。这正是因为JavaScript引擎自动提升了变量y的声明,但不会提升变量y的赋值。
ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量
'use strict';
function foo() {
var sum = 0;
for (let i=0; i<100; i++) {
sum += i;
}
// SyntaxError:
i += 1;
}
ES6标准引入了新的关键字const来定义常量,const与let都具有块级作用域: