有争议的“with”声明:它可以用来做好事吗?
Alan Storm 对“with”声明的言论引发了好奇在我们之中。虽然它的实用性很少被探索,但其潜在的陷阱仍不清楚。我们深入研究了它的使用,发现了一些合法的应用程序,同时规避了它的风险。
“with”语句的亮点
“with”语句的一个值得注意的用途是在块作用域内定义变量。 JavaScript 缺乏块作用域变量,因此很容易在循环和闭包中出现作用域问题。
For 循环和“with”语句
考虑以下代码:
for (var i = 0; i < 3; ++i) { setTimeout(function() { alert(num); }, 10); }
此代码旨在异步显示循环计数器“i”。但是,它失败了,因为 JavaScript 不会为每次迭代引入新的作用域,并且变量“num”在所有三个闭包之间共享。
使用“with”模拟块作用域
在 ES6 广泛使用之前,可以使用“with”语句来模拟块作用域:
for (var i = 0; i < 3; ++i) { with ({num: i}) { setTimeout(function() { alert(num); }, 10); } }
这段代码为每次迭代创建一个带有“num”属性的单独对象,有效地隔离块范围内的变量。
“with”的其他用途
此外模拟块作用域,也可以使用“with”语句for:
方便地访问对象属性:
with (object) { property = value; }
迭代对象属性:
with (object) { for (property in this) { // Do something with the property } }
要避免的陷阱
虽然“with”语句很有用,但它也有潜在的陷阱:
结论
with 语句在特定场景中是一个有用的工具,例如模拟块作用域和方便地访问对象属性。然而,在代码中使用它之前,应该仔细考虑它的潜在缺点。
以上是JavaScript 中的'with”语句是有用的工具还是问题的根源?的详细内容。更多信息请关注PHP中文网其他相关文章!