【问题标题】:JavaScript shadowing with initialization带有初始化的 JavaScript 阴影
【发布时间】:2016-09-08 01:36:47
【问题描述】:

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

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

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 的名称,但编译器目前还不能轻松跟踪它,这会带来额外的麻烦。

【问题讨论】:

  • “外部变量”总是在全局范围内吗?如果是这样,事情就容易多了。
  • 不,它通常在当前范围之外的范围内
  • 好的,所以 Danny 的回答就是成功。尽管您所做的事情可能会让维护代码的任何人感到困惑。
  • 引用操作Passing it as an argument is not an option

标签: javascript shadowing


【解决方案1】:

您需要将a 作为参数传递给您的IIFE

(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

【讨论】:

    【解决方案2】:

    由于这是一个立即调用的函数表达式,它的作用域与在它之外编写的代码完全不同。如果不以某种方式传入参数(无论是直接在执行还是使用 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));
    

    【讨论】:

    • 函数范围无论如何都不能改变。 bind是用来设置this的,这完全是另外一回事。
    • @RobG 在将this 的值作为bind 方法的第一个参数传入后,您可以将其他参数传入bind 方法,该方法将添加到提供给绑定的参数之前调用目标函数时的函数。
    • 另外@RobG 可以通过更改函数的定义方式来更改函数范围。通过定义常规函数而不是 IIFE,该函数将可以从外部范围访问 var a
    猜你喜欢
    • 2014-10-23
    • 2012-01-08
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多