js 闭包

<!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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值