一、定义函数
①函数声明
function square(number) {
return number * number;
}
原始参数(比如一个具体的数字)被作为值传递给函数;值被传递给函数,如果被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用函数;
如果你传递一个对象(即一个非原始值,例如Array或用户自定义的对象)作为参数,而函数改变了这个对象的属性,这样的改变对函数外部是可见的
②函数表达式
匿名函数
var square = function(number) { return number * number; };
也可提供函数名,并且可以用于在函数内部代指其本身,或者在调试器堆栈跟踪中识别该函数:
var factorial = function fac(n) {return n<2 ? 1 : n*fac(n-1)};
console.log(factorial(3));
③Function 构造器*
二、调用函数
递归:函数可以自己调用自己
三、函数作用域
四、作用域和函数堆栈
递归
一个函数可以指向并调用自身:
①函数名
②argument.callee
③作用域下的一个指向该函数的变量名
var foo = function bar() {
//bar()
//arguments.callee()
//foo()
//这三种语句是等价的
};
嵌套函数和闭包
一个函数嵌套另外一个函数,内部函数对其外部函数是私有的,自身形成了一个闭包。
一个闭包是一个可以拥有独立的环境与变量的表达式(通常是函数)
嵌套函数是一个闭包,嵌套函数可以继承容器函数的参数和变量,内部函数包含外部函数的作用域
总结:内部函数只可以在外部函数中访问;内部函数形成了一个闭包,它可以访问外部函数的参数和变量,但是外部函数却不能使用它的参数和变量。
function outside(x) {
function inside(y) {
return x + y;
}
return inside;
}
fn_inside = outside(3); // 可以这样想:给一个函数,使它的值加3
result = fn_inside(5); // returns 8
result1 = outside(3)(5); // returns 8
保存变量
上述例子,inside
被返回时 x
是怎么被保留下来的?
多层嵌套函数
作用域链
命名冲突
优先级:
inside
> outside
>全局对象
五、闭包
var getCode = (function(){
var secureCode = "0]Eal(eh&2"; // A code we do not want outsiders to be able to modify...
return function () {
return secureCode;
};
})();
getCode();
六、使用 arguments
对象
函数的实际参数会被保存在一个类似数组的arguments
对象中
arguments[i]
七、函数参数
默认参数
JS中函数参数默认值是undefined
过去:
function multiply(a, b) {
b = (typeof b !== 'undefined') ? b : 1;
return a*b;
}
multiply(5); // 5
ES6:
function multiply(a, b = 1) {
return a*b;
}
multiply(5); // 5
剩余参数
将不确定数量的参数表示成数组
function multiply(multiplier, ...theArgs) {
return theArgs.map(x => multiplier * x);
}
var arr = multiply(2, 1, 2, 3);
console.log(arr); // [2, 4, 6]
八、箭头函数
简洁、 this
值
九、预定义函数
eval()
isFinite()
isNaN()
parseFloat()
parseInt()
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()