javascript变量的阴影抛出一个异常

时间:2016-01-15 10:06:57

标签: 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中有这样的情况吗?

3 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:1)

首先提出的varian不适用于我,因为我在那里有事件监听器,而不是IIFE,因此就事件发送器控制的闭包参数而言,我无法传递任何参数。 但实施建议我另一种解决方案,即完美适合:

(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 */
})()
})()

答案 2 :(得分:-1)

你覆盖' a'通过定义(本地版本" var a")...只需说a = a.b + 4;因为你确实定义了它,所以它不会成为新的全局变量并将使用其他变量...... 你也用原始的7值覆盖了对象a,所以在这种自称的方法中它什么都没有,但是在你想再次调用它的另一个地方,它不会成为任何对象,而且只有a原始留给你