代码:
(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中有这样的情况吗?
答案 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原始留给你