变量的JavaScript阴影会引发异常



代码:

(function() {
  'use strict'; // es6 is on
  var a = {
    b: 3
  };
  (function() {
    var a = a.b + 4;
    console.log(a);
    /** many lines where a is used */
  })()
})()

我期望在控制台中获得 7,但我有一个例外。我可以理解为什么这个令人满意的解决方法将是委婉地重命名内部变量。但是我想避免这种情况,那么有没有另一种方法可以在不重命名变量的情况下强制它工作?我正在使用与 es6 兼容的环境工作,所以可能在 es6 中有一些情况?

var a甚至在执行任何函数体之前就保留局部变量名;它立即隐藏它,而不仅仅是在赋值时。想象一下它像这样执行:

var a = undefined;
a = a.b + 4;

因此,如果不重命名内部变量,就无法获取父范围的 a 值。


要解决此问题,您可以将该值传递到 IIFE 中:

var a = { b: 3 };
(function (_a) {
    var a = _a.b + 4;
    console.log(a);
})(a)

或者甚至使用函数参数已经声明了新的局部变量名称的事实:

(function (a) {
    a = a.b + 4;
    console.log(a);
})(a)

首先提出的瓦里安对我不起作用,因为我那里有事件侦听器,而不是 IIFE,所以我无法传递任何参数,就事件发射器控制的闭包参数而言。但是实现为我提供了另一种解决方案,whitch 非常适合:

(function(){
'use strict'; // es6 is on
var a = {b:3};
function getA(){
    return a;
}
(function(){
    var a = getA().b+4;
    console.log(a);
    /** many lines where a is used */
})()
})()

u 通过定义(本地版本"var a")来覆盖"a"...只要说 a = a.b+4;由于您确实定义了它,因此它不会成为新的全局变量,而是将使用另一个...此外,您正在用原始 7 值覆盖对象 A,因此在这个自称为方法中它什么都不是,但是在您想再次调用它的另一个地方,不会有任何对象,只有一个原始留给您

最新更新