匿名函数
<script type="text/javascript">
//function(){}//会报错
var fun = function(){};//将匿名函数赋值给变量
(function(){})();//匿名函数自执行
function(){
return function(){};//函数里的匿名函数
}
</script>
闭包
<script type="text/javascript">
//通过闭包可以返回局部变量
function box() {
var user = 'Lee';
return function () { //通过匿名函数返回box()局部变量
return user;
};
}
console.log(box()()); //通过box()()来直接调用匿名函数返回值
var b = box();
console.log(b()); //另一种调用匿名函数返回值
//通过闭包可以实现局部变量的累加
function box() {
var age = 100;
return function () {
age ++;
return age;
}
}
var b = box(); //获得函数
console.log(b()); //调用匿名函数
console.log(b()); //第二次调用匿名函数,实现累加
</script>
循环里的闭包
<script type="text/javascript">
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
};
}
return arr;
}
var b = box(); //得到函数数组
console.log(b.length); //得到函数集合长度
for (var i = 0; i < b.length; i++) {
console.log(b[i]()); //输出每个函数的值,都是最后一个值
}
</script>
循环里的闭包--修改
<script type="text/javascript">
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = (function (num) {
return function () { //返回函数
return num;
}
})(i);
/*
//相当于:
arr[i] = (function () {
var num = i;//定义一个局部变量
return function () {
return num;
}
})();
*/
}
return arr;
}
var b = box(); //得到函数数组
for (var i = 0; i < b.length; i++) {
console.log(b[i]()); //0,1,2,3,4
}
</script>
通过在box作用域里新建块级作用域来是每个返回函数保存的变量都不一样闭包中的this对象
<script type="text/javascript">
var user = 'The Window';
var obj = {
user : 'The Object',
getUserFunction : function () {
return function () { //闭包不属于obj,里面的this指向window
return this.user;
};
}
};
console.log(obj.getUserFunction()()); //The window
//可以强制指向某个对象
console.log(obj.getUserFunction().call(obj)); //The Object
/*
//也可以从上一个作用域中得到对象
getUserFunction : function () {
var that = this; //从对象的方法里得对象
return function () {
return that.user;
};
}
*/
</script>
模仿块级作用域
<script type="text/javascript">
//使用块级作用域(私有作用域)改写
function box(count) {
(function () {
for (var i = 0; i<count; i++) {}
})();
console.log(i); //报错,无法访问
}
box(2);
</script>
私有变量
<script type="text/javascript">
function Box() {
var age = 100; //私有变量
function run() { //私有函数
return '运行中...';
}
this.get = function () { //对外公共的特权方法,闭包(函数访问了不属于对象作用域的age和run方法)
return age + run();
};
}
var box = new Box();
console.log(box.get());
</script>
静态私有变量
<script type="text/javascript">
(function () {
var age = 100;//静态私有变量
function run() {
return '运行中...';
}
Box = function () {}; //构造方法,没有使用var,全局函数
Box.prototype.go = function () { //原型方法
return age + run();
};
})();
var box = new Box();
console.log(box.go());
</script>
模块模式
<script type="text/javascript">
var box = function () { //box是一个模块
var age = 100;
function run() {
return '运行中...';
}
return { //直接返回对象
go : function () {
return age + run();
}
};
}();
</script>