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 闭包中的变量赋值为何会影响外层函数的行为?的详细内容,更多请关注其它相关文章!