TypeScript 闭包中的变量赋值为何会影响外层函数的行为?

TypeScript 闭包中的变量赋值为何会影响外层函数的行为?

item = null;为何在后面却影响了前面函数中的item?

在给定的代码片段中,TypeScript将元素querySelectorAll中返回的NodeList转换为数组:

let divs = document.querySelectorAll('div');

然后,该数组被映射到一个新的数组,其中每个元素都是div:

divs.forEach(item => {
  // ...
})

在forEach函数的回调中,对每个item的addEventListener属性进行调用:

item.addEventListener('click', () => {
  // ...
})

这段代码绑定了一个点击事件,当div元素被点击时,该事件将执行一个匿名回调函数。请注意,item变量是一个闭包变量,它将指代其当前绑定的div元素。

然而,在回调函数之外有一个问题:

item = null;

这行代码将item变量赋值为null。问题在于,item变量同时指向回调函数中使用的div元素和原始的forEach回调中使用的div元素。

由于这是相同的变量,因此将item赋值为null将同时修改回调函数中的item变量和原始forEach回调中的item变量。

这意味着当点击事件触发时,回调函数中的item变量已经是null,即使它之前被绑定为div元素。这就是为什么在回调函数中console.log(item)将输出null的原因。

总结:

TypeScript中的闭包变量可以让一个函数访问其外层函数中的变量,但值得注意的是,对该变量的任何更改都将影响外层函数的行为。在本例中,将item赋值为null会同时影响回调函数和原始forEach回调中的item变量。

以上就是TypeScript 闭包中的变量赋值为何会影响外层函数的行为?的详细内容,更多请关注其它相关文章!