当前位置: 首页 > 面试题库 >

JavaScript不支持带局部变量的闭包吗?

支智志
2023-03-14
问题内容

我对此代码感到非常困惑:

var closures = [];
function create() {
  for (var i = 0; i < 5; i++) {
    closures[i] = function() {
      alert("i = " + i);
    };
  }
}

function run() {
  for (var i = 0; i < 5; i++) {
    closures[i]();
  }
}

create();
run();

据我了解,它应该打印0、1、2、3、4(这不是闭包的概念吗?)。

而是打印5、5、5、5、5。

我尝试了Rhino和Firefox。

有人可以向我解释这种行为吗?提前谢谢。


问题答案:

通过添加其他匿名函数来修复Jon的答案:

function create() {
  for (var i = 0; i < 5; i++) {
    closures[i] = (function(tmp) {
        return function() {
          alert("i = " + tmp);
        };
    })(i);
  }
}

解释是JavaScript的作用域是函数级的,而不是块级的,创建闭包仅意味着将封闭范围添加到封闭函数的词法环境中。

循环终止后,函数级变量i具有值5,这就是内部函数所看到的。

附带说明:您应该提防不必要的函数对象创建,尤其是在循环中;它效率低下,并且如果涉及DOM对象,则创建循环引用很容易,因此会在Internet
Explorer中引入内存泄漏。



 类似资料:
  • 问题内容: 我对此代码感到非常困惑: 据我了解,它应该打印0、1、2、3、4(这不是闭包的概念吗?)。 而是打印5、5、5、5、5。 我尝试了Rhino和Firefox。 有人可以向我解释这种行为吗?提前谢谢。 问题答案: 通过添加其他匿名函数来修复Jon的答案: 解释是JavaScript的作用域是函数级的,而不是块级的,创建闭包仅意味着将封闭范围添加到封闭函数的词法环境中。 循环终止后,函数级

  • 本文向大家介绍浅谈JavaScript的全局变量与局部变量,包括了浅谈JavaScript的全局变量与局部变量的使用技巧和注意事项,需要的朋友参考一下 一、JavaScript scope 的划分标准是function函数块,不是以 if、while、for来划分的 二、JavaScript在执行之前会对整个脚本文件进行预编译(对脚本文件的声明部分做分析,包括局部变量部分),从而确定实变量的作用域

  • 闭包定义 我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如: Route::get('hello', function () { return 'hello,world!'; }); 参数传递 闭包定义的时候支持参数传递,例如: Route::get('hello/:name', function ($name) { return 'Hello,'

  • 下面是代码: null null 当我点击乘法或除法按钮触发函数时,我得到的结果是NAN,但我认为num1和num2都是全局变量,有人能帮我弄清楚为什么这两个都没有定义吗?

  • 本文向大家介绍javascript中局部变量和全局变量的区别详解,包括了javascript中局部变量和全局变量的区别详解的使用技巧和注意事项,需要的朋友参考一下 javascript有两种变量:局部变量和全局变量。当然,我们这篇文章是帮助大家真正的区别这两种变量。 首先,局部变量是指只能在本变量声明的函数内部调用。全局变量时整个代码中都可以调用的变量。当然,单单从字面上理解肯定是不清楚的,下面我

  • 本文向大家介绍JavaScript闭包函数访问外部变量的方法,包括了JavaScript闭包函数访问外部变量的方法的使用技巧和注意事项,需要的朋友参考一下 闭包是指有权访问另一个函数作用域中的变量的函数,但作用域的配置机制有一个需要注意的地方,即闭包只能取得包含函数中任何变量的最后一个值。 如以下案例: 执行结果: 表面上看,似乎每个函数返回的i值都不相同,比如c_arr[0]的值应该是0,c_a