为了账号安全,请及时绑定邮箱和手机立即绑定

js中非常简单的变量泄露问题

js中非常简单的变量泄露问题

慕妹3242003 2019-03-15 18:15:51
var a = [];for (var i = 0; i < 10; i++) {  a[i] = function () {    console.log(i);  };}a[6](); // 10变量泄露导致上面的a[6]变成10;我不太理解 这里为什么a[6]是10,我的错误思维如下a[6] 这里没有变量, 所以内存泄露源于循环循环中,每次都是把当前次数赋值给对应的数组,a[0] = function () { console.log(0);};a[1] = function () { console.log(1);};......a[9] = function () { console.log(9);};再每一次赋值的时候i的值是正确的,赋值后,每个函数都是固定输出一个数字,也不存在变量3.请问 我的思维错在哪里了
查看完整描述

6 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

这个题已经问烂了也回答不知道多少遍了

i是全局变量 函数调用的时候获取i 此时 i已经循环到了10

下面是个简单了例子可以理解为经历了两次循环


var i = 1;

function a1(){ console.log(i) }


var i = 2;

function a2(){ console.log(i) }


a1();//2

a2();//2

解决方法 将i变为局部变量


es6

{

  let i = 1;

  function a1(){ console.log(i) }

}


{

  let i = 2;

  function a2(){ console.log(i) }

}


a1();//1

a2();//2

//es6 let局部变量

for(let i=0;i<10;i++) ...

//or

//自执行函数 es5中只有函数内有局部作用域 

for (var i = 0; i < 10; i++) {

  a[i] = (function(i){

      return function () {

            console.log(i);

          };

  })(i)

}


查看完整回答
反对 回复 2019-03-28
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

问题源于对函数作用域(链)的理解不够深,一下是个人的一点见解,望能帮助到您:


    var a = [];

    for (var i = 0; i < 10; i++) {   // 此处变量i为全局变量,属于外层作用域(window)

      // 此处声明函数,创建函数的作用域(建立作用域链,函数内部能访问外层作用域中的i变量,但此处只是声明,并不执行)

      a[i] = function () {     

        // 函数内部并未定义i变量,当函数执行时通过声明函数时建立的作用域链向上查找变量i

        // 调用a[6]时,for循环已经结束,变量i已经变成10,所以此处打印输出 10

        console.log(i);   

      };

    }

    a[6](); // 10


查看完整回答
反对 回复 2019-03-28
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

执行a[6]()的时候,i已经循环到了10了


查看完整回答
反对 回复 2019-03-28
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

闭包问题,同学你的基础要加油了.


查看完整回答
反对 回复 2019-03-28
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

其实 es6 的 let 根本没抓住问题的本质


关键在于 js 作为一个允许副作用的语言,它的 closure 却只支持引用外层作用域的变量,而不支持「引用」外层作用域中变量的值


C++ 就没有这个问题~


#include <functional>

#include <iostream>


using namespace std;


int main() {

  function<void()> a[10];

  for (int i = 0; i < 10; i++) {

    a[i] = [i] () {

      cout << i << '\n';

    };

  }

  a[6](); // 6

}

之所以出现这个反直觉的现象,就是因为你那 10 个函数引用的都是同一个 i 变量,而这个变量的值是 for 循环最后一次执行时的值,也就是 10。


查看完整回答
反对 回复 2019-03-28
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

简单的闭包问题,我面试的时候都被问到过好几次了。


查看完整回答
反对 回复 2019-03-28
  • 6 回答
  • 0 关注
  • 490 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号