博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript兼容问题 : let降级到var 遇到的闭包问题的解决方法
阅读量:4883 次
发布时间:2019-06-11

本文共 1327 字,大约阅读时间需要 4 分钟。

我用  for(let x in y) 循环一个图片元素数组。

for (let x in arr) {  arr[x].onload = function(){ /* ... */ }  }

这样写是没有问题的,因为:

for (let x...)的循环在每次迭代时都为x创建新的绑定。

 

...

在ES标准中,有一段是关于,也就是for语句每次循环所要建立环境的步骤,里面有提及有关词法环境的相关步骤(LexicalEnvironment),这与使用let时会有关。所以,如果你使用了let而不是var,let的变量除了作用域是在for区块中,而且会为每次循环执行建立新的词法环境(LexicalEnvironment),拷贝所有的变量名称与值到下个循环执行。

...

但是 用 var 就不行了,因为运行环境没有更新,所以 onload 拿到的 [i] 每次都是最后一位。

相当于:

// 不需要加区块符,因为区块也不会影响var i;i = 0;if (i < 10)    setTimeout(()=>console.log("i:",i), 1000);    i++;    if (i < 10)        setTimeout(()=>console.log("i:",i), 1000);        i++;//...

拿怎么办呢?

在我一筹莫展的时候。 Babel 给了我答案。

原来的代码:

// _this : this(vue实例)for (let i in img_arr) {  img_arr[i].onload = function () {    origin_size_arr[i] = {      width: this.width,      height: this.height,    }    if (_this.img_calc_count === (img_arr.length - 1)) {            _this.waterFullBFunc()    } else {      _this.img_calc_count++    }  }}

Babel 降级之后:

var _loop = function _loop(i) {  img_arr[i].onload = function () {    origin_size_arr[i] = {      width: this.width,      height: this.height    };    if (_this.img_calc_count === img_arr.length - 1) {      _this.waterFullBFunc();    } else {      _this.img_calc_count++;    }  };};// _this : this(vue实例)for (var i in img_arr) {  _loop(i);}

以上。

参考:

 

转载于:https://www.cnblogs.com/foxcharon/p/11069333.html

你可能感兴趣的文章
自动化测试用例getText()获取某一个元素的值返回null或空
查看>>
大数智能未来
查看>>
virtualenv和virtualenvwrapper 的安装和使用
查看>>
MAC sublime text 无法自动补齐标签
查看>>
NgBook留言本开发全过程(1)
查看>>
LeetCode-指针法
查看>>
Mysql phpStudy升级Mysql版本,流产了怎么办?
查看>>
SQLServer之数据库行锁
查看>>
OFDM仿真
查看>>
浅谈linux内核中内存分配函数
查看>>
写在读研初期
查看>>
开环增益对负反馈放大电路的影响
查看>>
MySQL-ERROR 2003
查看>>
SQL Server2012-SSIS的包管理和部署
查看>>
JavaScript内置对象
查看>>
如何把js的循环写成异步的
查看>>
ER图是啥?
查看>>
too many include files depth = 1024错误原因
查看>>
HTTP协议详解(三)
查看>>
Android零基础入门第84节:引入Fragment原来是这么回事
查看>>