一、函数定义
(1)使用function declaration
格式:function functionName(parameters) {
function body
}
注:此种方式声明的函数作用域是全局的,即在声明之前可以调用
(2)使用function expression
格式:var name = function (parameters) { function body };
注:与(1)不同,在声明之前不可以调用
(3)使用function constructor()
格式:var myFunction = new Function("a", "b", "return a * b");
注:不推荐使用,大多数情况下,在js中应该避免使用new关键字
二、Self-Invoking函数
使用(2)方式声明的函数可以被定义成“self-invoking”,self-invoking expression可以不必调用自动执行。
self-invoking函数条件:
(1)函数被”()“包括
(2)function expression is followed by ();
例:(function () {
var x = "Hello"; // I will invoke myself
})();
三、Function Object
在JS中,函数也是object,有自己的property和method,如arguments.length返回函数接收到的参数的个数;toString()方法返回函数的字符串形式。
四、参数
JS不会对接收到的参数做任何检查,包括参数个数、类型等等。
如果函数接收到的参数个数小于声明时的个数:未传递的参数被当做undefined
基本类型:值传递
object类型:传递的是引用
五、函数调用
使用call() 和 apply()两个函数来调用函数,必须有owner object作为第一个参数。
不同之处:
(1)使用call():参数一个个接收
function myFunction(a, b) { return a * b; }
myFunction.call(myObject, 10, 2);
(2)使用apply(): 使用数组接收
function myFunction(a, b) { return a * b; }
var myArr = [10, 2];
myFunction.call(myObject, myArr);
六、Closure
使用closure可以实现函数private变量。
Nested Function:定义在函数内部,可以访问其父函数内定义的局部变量。
closure实现例子:
var add = (function () {
var counter = 0;
return function () { return counter += 1; }
})();
add(); // 1
add(); // 2
add(); // 3
w3schools.com上对此解释:
A closure is a function having access to the parent scope, even after the parent function has closed.