闭包问题-及js高程中闭包与变量例题解析

      闭包是js中的重点,也是一个较难理解的一个点,但是其应用却很广,故而理解并正确使用闭包是很有必要的。

      定义:有权访问另一个函数作用域中的变量的函数。

      如下,我想获取 test 的值,即输出test

function init() {
    var test =test;
}
var result = test;
console.log(result);
      输出的结果是 not defined,是无法访问函数内的变量,使用闭包的情况下

function init() {
    var test ="test";
    return function () {
        return test;
    }

}
var result = init()();
console.log(result);
      输出的结果就是函数的局部变量 test的值,[调用init时要两个小括号对,第一对时立即执行init,此时返回的是一个匿名函数,要立即执行这个匿名函数,需要加一对小括号,所以需要两对小括号]

     来看看下面的程序输出

function func() {
    var result = new Array;

    for(var i = 0;i<10;i++){
        result[i] = function () {
            return i ;
        }
    }
    return result;
}

var results = func();
results.forEach(function (element) {
    console.log(element());
});
     result 最后输出的是10个10,并不是保存的0-9,这是由于result中保存是的同一个匿名函数的引用,而匿名函数就是闭包的表现形式,闭包中的变量是保存的匿名函数外部的变量 i ,当我们去调用的时候,变量 i 的值已经增加到 10了 ,即保存的是作用域链上的最终结果,所以想要实时输出 i 变量的值,必须立即执行闭包匿名函数。

function func() {
    var result = new Array;

    for(var i = 0;i<10;i++){
        result[i] = function (num) {
            return num ;
        }(i)
    }
    return result;
}

var results = func();
results.forEach(function (element) {
    console.log(element);
});
    此时输出的就是0-9,可以对比两个程序输出的方式,第一个是element(),第二个是element,由于第二个程序中,匿名函数立即执行了,result中存的是返回的num的值,而不是匿名函数的应用了。

    当然书上用这个例子,想说明的是闭包中的变量保存的是其作用域链上的终值。
       



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值