一、实例
<script type="text/javascript">
// 函数就是闭包
// 函数作用域中的变量无法在外键访问,使用retrun将
// 一个可以访问这个变量的对象返回到外界就形成一个闭包
var Person = function(name, age, sex) {
return {
get_Name : function() {
return name;
},
set_Name : function(value) {
name = value;
},
get_Age : function() {
return age;
},
get_Sex : function() {
return sex;
}
}
};
var p = Person("赵晓虎", 19, "男");
alert(p.get_Name());
p.set_Name("TigerZhao");
alert(p.get_Name());
</script>
(一)、显示
第一个
第二个
二、实例
<script type="text/javascript">
function init() {
var name = "你好"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
displayName();
}
init();
</script>
(一)、显示
init()
创建了一个局部变量 name
和一个名为 displayName()
的函数。displayName()
是定义在 init()
里的内部函数,仅在该函数体内可用。displayName()
内没有自己的局部变量,然而它可以访问到外部函数的变量,所以 displayName()
可以使用父函数 init()
中声明的变量 name
。但是,如果有同名变量 name
在 displayName()
中被定义,则会使用 displayName()
中定义的 name
。
displayName()
内的 alert()
语句成功的显示了在其父函数中声明的 name
变量的值。这个词法作用域的例子介绍了引擎是如何解析函数嵌套中的变量的。词法作用域中使用的域,是变量在代码中声明的位置所决定的。嵌套的函数可以访问在其外部声明的变量。
三、实例
<script>
function makeFunc() {
var name = "你好";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
</script>
其中的不同 — 也是有意思的地方 — 在于内部函数 displayName()
在执行前,被外部函数返回。 闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量。在我们的例子中,myFunc
是执行 makeFunc
时创建的 displayName
函数实例的引用,而 displayName
实例仍可访问其词法作用域中的变量,即可以访问到 name
。由此,当 myFunc
被调用时,name
仍可被访问,其值 “你好” 就被传递到alert
中。