一 函数的定义
JavaScript三种定义函数方法:
*第一种 使用function语句定义函数
myFunction(5);
function myFunction(y) {
return y * y;
}
第二种 使用Function()构造函数来定义函数(不常用)
var 函数名 = new Function(“参数1”,”参数2”,”参数3”……”函数体”);
如:
var 函数名 = new Function("x","y","var z=x+y;return z;");
*第三种 函数表达式
JavaScript 函数可以通过一个表达式定义。
函数表达式可以存储在变量中:
var 函数名 = function(参数1,参数2,…){函数体};
//例如:
//定义
var add = function(a,b){
return a+b;
}
//调用函数
document.write(add(50,20));
第四种 自调用函数
函数表达式可以 "自调用"。
自调用表达式会自动调用。
如果表达式后面紧跟 () ,则会自动调用。
不能自调用声明的函数。
通过添加括号,来说明它是一个函数表达式:
实例:
(function () {
var x = "Hello!!"; // 我将调用自己
})();
注意:
arguments 对象
在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。
例如,在函数 sayHi() 中,第一个参数是 message。用 arguments[0]
也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,
第二个参数位于位置 1,依此类推)。
例如:arguments
x = sumAll(1, 123, 500, 115, 44, 88);
function sumAll() {
var i, sum = 0;
for (i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
关于变量和参数问题:
1. 函数外面定义的变量是全局变量,函数内可以直接使用
2. 在函数内部没有使用var定义的=变量则为全局变量
3. 在函数内使用var关键字定义的变量是局部变量,即出了函数外边无法获取。
函数支持默认值
4. 在函数内部定义的函数为局部函数 在函数外部不能获取到
二 JavaScript 闭包
JavaScript 变量可以是局部变量或全局变量。
私有变量可以用到闭包。
函数内部可以修改函数外部的全局变量
计数器困境
设想下如果你想统计一些数值,且该计数器在所有函数中都是可用的。
你可以使用全局变量,函数设置计数器递增:
var counter = 0;
function add() {
return counter += 1;
}
add();
add();
add();
// 计数器现在为 3
但问题来了,页面上的任何脚本都能改变计数器,即便没有调用 add() 函数。
如果我在函数内声明计数器,如果没有调用函数将无法修改计数器的值:
function add() {
var counter = 0;
return counter += 1;
}
add();
add();
add();
// 本意是想输出 3, 但事与愿违,输出的都是 1 !
JavaScript 内嵌函数
所有函数都能访问全局变量。
实际上,在 JavaScript 中,所有函数都能访问它们上一层的作用域。
JavaScript 支持嵌套函数。嵌套函数可以访问上一层的函数变量。
该实例中,内嵌函数 plus() 可以访问父函数的 counter 变量:
实例:
function add() {
var counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
JavaScript 闭包
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
// 计数器为 3