<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script>
//由于闭包回会携带包含他函数的作用域,因此会占用更多的内存。
//实例1
function createSomething() {
var result=new Array();
for(i=0;i<10;i++ ){
result[i]=function () {
return i;
};
}
return result
}
//返回一个数值。表面上看返回索引值。实际上。返回的都是10 ,因为每个函数的作用域链中都保存着createSomething()的活动对像。所以他们引用的都是同一个变量i;
//createSomething(),函数返回后。变量i=10;
//可以通过在创建一个匿名函数强制让闭包的行为符合预期。
//
function createSomething() {
var result=new Array();
for(i=0;i<10;i++ ){
result[i]=function (num) {
return function () {
return num
};
}(i);
}
return result
}//在调用每个匿名函数的时候。我们传入变量i,由于函数参数是按值传递的,所以就会将当前的i 复制给参数num.而,
//而匿名函数里面还有,一个访问num的闭包,所以,result数值里每一个函数都有自己num变量的一个副本。
//实例2。闭包中的this指向
var name="The window";
var Object={
name:"shanghai",
getName:function () {
return function () {
return this.name
};
}
};
alert(Objetc.getName()());//The window//在费严格模式下;
//为什么返回不是Object。里面的name ;
//每个函数在被调用时都会自动取得两个特殊变量。arguements和this。内部函数在搜索这两个变量时。只会搜索到活动对象为止。所以永远不能直接访问外部函数中的的这两个变量。
//可以吧外部作用域的this对象保存在一个闭包能够访问到的变量里。就可以了。如下
var name="The window";
var Object={
name:"shanghai",
getName:function () {
var that=this;
return function () {
return that.name;s
};
}
};
//在几种特殊的情况下,可能意外的改变;
var name="The window";
var Object={
name:"shanghai",
getName:function () {
return this.name;
}
};
Object.getName()//" Object.getName()
( Object.getName())// Object.getName()//这两种一样的定义相同。this的值得到了维持。
( Object.getName= Object.getName)();//"The window";//先付值,在调用。因为这个赋值表达式的值是函数身。this 的值就得不到维持
//
// 如果你要让object做为这个this,你可以这样做:
(object.getName=object.getName).call(this);
嗯,我知道要维持this的话,可以申请一个变量来保存this的值才付给闭包函
</script>
</html>