JavaScript初始化阴影

时间:2016-09-08 01:36:48

标签: javascript shadowing

在我深入研究这个问题之前,我想澄清一下,我的用例涉及修补反编译器以生成一个适当的等价物,因此这个问题有点尴尬。

我想隐藏一个外部变量,但也将它初始化为与外部相同的值。这是一个例子:

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

我在上面的示例中意识到内部a将是NaNundefined + 3),但是我可以将执行阴影的变量初始化为它以某种方式阴影的同一个吗?将它作为参数传递不是一个选项,因为该函数将由用户编写,唯一一致的是内部范围的存在。我正在考虑更改内部变量a的名称,但编译器目前没有以轻松跟踪它的方式构建,这会引入额外的麻烦。

2 个答案:

答案 0 :(得分:4)

您需要在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




答案 1 :(得分:0)

由于这是一个立即调用的函数表达式,因此它的范围与在其外部编写的代码完全不同。如果不以某种方式传递参数(无论是直接执行还是使用bind),或者更改函数使得范围是定义了所需var a的范围的范围,就无法做你要求的事。

有了这样说,或许你可以返回一些将a设置为适当值的方法。

http://jsbin.com/vazequhigo/edit?js,console

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));