带有初始化的JavaScript阴影

JavaScript shadowing with initialization

本文关键字:JavaScript 阴影 初始化      更新时间:2023-09-26

在我深入讨论这个问题之前,我想澄清一下,我的用例涉及到修补一个转换编译器来生成一个适当的等价,因此有点尴尬的问题。

我想要遮蔽一个外部变量,但初始化它为与外部变量相同的值。下面是一个例子:

var a = 2;
(function(){
    var a = a;
    a += 3;
    // I want `a` to be 5
})();
// I want `a` to be 2

我意识到上面的例子,内部的a将是NaN (undefined + 3),但我可以初始化变量做阴影相同的一个,它以某种方式阴影?将其作为参数传递是不可选的,因为该函数将由用户编写,唯一保持一致的是内部作用域的存在。我正在考虑改变内部变量a的名称,但编译器目前没有以一种容易跟踪它的方式构建,这将引入额外的头痛。

您需要在IIFE中传递a作为参数。

(function(parameter){
 // «parameter» contains the given value.
 // parameter = "Some value".
})("Some value");

像这样:

var a = 2; // Variable declaration in the global scope.
(function(a) {
  a += 3;
  // I want `a` to be 5
  console.log(a); // Prints the current value in the local scope.
})(a); // The parameter: var a = 2;
console.info(a); // Prints the current value in the global scope.
// I want `a` to be 2

由于这是一个立即调用的函数表达式,因此它的作用域与在它之外编写的代码完全不同。如果不以某种方式传递参数(无论是直接在执行或使用bind时),或者更改函数,使其作用域与所要的var a定义的作用域相同,则无法完成您所要求的操作。

话虽如此,也许你可以返回一些方法,将a设置为适当的值。

http://jsbin.com/vazequhigo/edit?js,控制台

var a = 2;
w = (function(){
    var setA = function(val) {
        a = val;
    }
    var addA = function(val) {
        a += val;
        return a;
    }
    var a = 0;
    return {
        setA: setA,
        addA: addA,
    };
})();
w.setA(a);
console.log(w.addA(3));