简介:块作用域非常有用的原因和闭包及回收内存垃圾的回收机制相关。这里简要说明一 下考虑以下代码:function process(data) { // 在这里做点有趣的事情 } var someReallyBigData = { .. }; process( someReallyBigData ) ...

块作用域非常有用的原因和闭包及回收内存垃圾的回收机制相关。这里简要说明一 下考虑以下代码:function process(data) { // 在这里做点有趣的事情 } var someReallyBigData = { .. }; process( someReallyBigData ); var btn = document.getElementById( "my_button" ); btn.addEventListener( "click", function click(evt) { console.log("button clicked"); }, /*capturingPhase=*/false );click 函数的点击回调并不需要 someReallyBigData 变量。理论上这意味着当 process(..) 执 行后,在内存中占用大量空间的数据结构就可以被垃圾回收了。但是,由于 click 函数形成 了一个覆盖整个作用域的闭包,JavaScript 引擎极有可能依然保存着这个结构块作用域可以打消这种顾虑,可以让引擎清楚地知道没有必要继续保存 someReallyBigData 了:function process(data) { // 在这里做点有趣的事情 } // 在这个块中定义的内容可以销毁了! { let someReallyBigData = { .. }; process( someReallyBigData ); } var btn = document.getElementById( "my_button" ); btn.addEventListener( "click", function click(evt){ console.log("button clicked"); }, /*capturingPhase=*/false );为变量显式声明块作用域,并对变量进行本地绑定是非常有用的工具,可以把它添加到你 的代码工具箱中了。

let循环

一个 let 可以发挥优势的典型例子就是之前讨论的 for 循环。for (let i=0; i<10; i++) { console.log( i ); } console.log( i ); // ReferenceErrorfor 循环头部的 let 不仅将 i 绑定到了 for 循环的块中,事实上它将其重新绑定到了循环 的每一个迭代中,确保使用上一个循环迭代结束时的值重新进行赋值。下面通过另一种方式来说明每次迭代时进行重新绑定的行为:{ let j; for (j=0; j<10; j++) { let i = j; // 每个迭代重新绑定! console.log( i ); } }由于 let 声明附属于一个新的作用域而不是当前的函数作用域(也不属于全局作用域), 当代码中存在对于函数作用域中 var 声明的隐式依赖时,就会有很多隐藏的陷阱,如果用 let 来替代 var 则需要在代码重构的过程中付出额外的精力。考虑以下代码:var foo = true, baz = 10; if (foo) { var bar = 3; if (baz > bar) { console.log( baz ); } // ... }这段代码可以简单地被重构成下面的同等形式:var foo = true, baz = 10; if (foo) { var bar = 3; // ... } if (baz > bar) { console.log( baz ); }但是在使用块级作用域的变量时需要注意以下变化:var foo = true, baz = 10; if (foo) { let bar = 3; if (baz > bar) { // <-- 移动代码时不要忘了 bar! console.log( baz ); } }

const

除了 let 以外,ES6 还引入了 const,同样可以用来创建块作用域变量,但其值是固定的 (常量)。之后任何试图修改值的操作都会引起错误。var foo = true; if (foo) { var a = 2; const b = 3; // 包含在 if 中的块作用域常量 a = 3; // 正常 ! b = 4; // 错误 ! } console.log( a ); // 3 console.log( b ); // ReferenceError!本文仅代表作者个人观点,不代表巅云官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱2522407257@qq.com。更多相关资讯,请到巅云www.rzxsoft.cn学习互联网营销技术请到巅云建站www.rzxsoft.cn。