闭包:
/**
* 循环遍历添加事件监听:
*/
var btn = document.getElementsByTagName("button");
for (var i = 0, length = btn.length; i < length; i++) { //btn为伪数组,避免btn.length每次都计算
btn[i].index = i; //存在闭包,需要保存当前索引
btn[i].onclick = function () {
alert(this.index + 1);
};
}
/**闭包:
* 内部函数引用外部函数的变量(函数),闭包是嵌套的内部函数
* 执行函数定义就产生闭包
*/
function func() {
var num = 0;
function fun() {
console.log(++num); //fun引用func的变量num
}
return fun;
}
var f = func(); //f指向fun
f(); //1
f(); //2 变量num未消失
/**闭包作用:
* 使函数内部的变量在函数执行完毕后,仍然存放于内存中,延长了局部变量的生命周期
* 从函数外部可以操作函数内部的变量(函数)
* 函数执行完毕后,局部变量一般不存在,存在于闭包中的局部变量可能存在
* 从函数外部不能直接访问函数内部的局部变量,但可通过闭包操作函数内部的局部变量
*/
闭包的生命周期:
/**闭包的生命周期:
* 内部函数定义执行完后产生
* 内部函数成为垃圾对象时生命周期结束
*/
function func() {
var num = 0; //函数提升,此时闭包已产生
function fun() {
console.log(++num); //fun引用func的变量num
}
return fun;
}
var f = func();
f();
f();
f = null; //f指向null,fun成为垃圾对象,闭包生命周期结束
闭包作用_自定义模板:
/* module.js */
(function () {
var msg = 'hello world';
function func() {
console.log(msg);
}
function fun() {
console.log(msg + ".");
}
window.customModule = {
func: func,
fun: fun
};
})();
/* index.js */
customModule.func(); //hello world
customModule.fun(); //hello world.
补充:
function func() {
num = 2; //意外的全局变量
}
func();
console.log(num); //2
var str = "hello";
var obj = {
str: "world",
display: function () {
return function () {
return this.str; //this -> window
}
}
};
alert(obj.display()()); //hello
var str = "hello";
var obj = {
str: "world",
display: function () {
var point = this; //this -> obj
return function () {
return point.str;
}
}
};
alert(obj.display()()); //world