闭包:闭包本质上就是函数内部和函数外部架起的一座桥梁。闭包是能够读取其他函数作用域内的变量的函数,由于变量是由作用域范围的,要读取其他作用域范围的变量,需理解javascript的“链式作用域结构”,子对象一级一级的向上寻找父作用域对象。
一个小例子:
function f1() {
var n = 99;
function f2() {
return n;
}
return f2;
}
var result = f1();
alert(result());
//比如这个例子:在f1外部是没办法访问n变量的。但是f1内部的函数f2却可以做到;
//那么我们可以让f1函数返回f2函数,通过f2可以在外部拿到n值。
闭包的作用:
1. setTimeout/setInterval
例: var num = 0;
function addnum() {
document.getElementById("txtdata").value = num;
num = num + 1;
setTimeout("addnum()", 1000);
}
2. 回调函数(callback):把函数作为参数,当主函数执行完毕后,再执行传进来的函数。
<script language="javascript" type="text/javascript">
function a(callback, msg) {
alert("wo xian lai!" + msg);
callback(msg);
}
function callback(msg) {
document.getElementById("txtdata").value = msg;
}
a(callback, ",ni deng deng");
</script>
3.
事件句柄(event handle)
<script language="javascript" type="text/javascript">
function hello() {
var str = "hello";
document.writeln(str);
}
window.onload = hello;
</script>
4. 利用闭包可以将我们自己定义的一些函数包起来。利用命名空间方式访问,增加代码可读性和安全性,避免不经意间的覆盖。
例:<main.js>
(function() {
function SetUserFieldFocus() {
document.getElementById('txtdata').value = "rxm";
}
window['NianJia'] = {};
window['NianJia']['SetUserFieldFocus'] = SetUserFieldFocus;
})();
页面实现:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<script language="javascript" type="text/javascript" src="main.js"></script>
<title>null</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="txtdata" type="text" onfocus="NianJia.SetUserFieldFocus();" />
</div>
</form>
</body>
</html>