Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带初始化的JavaScript阴影_Javascript_Shadowing - Fatal编程技术网

带初始化的JavaScript阴影

带初始化的JavaScript阴影,javascript,shadowing,Javascript,Shadowing,在我深入讨论这个问题之前,我想澄清一下,我的用例涉及到修补一个trans编译器以生成一个适当的等价物,因此这是一个有点尴尬的问题 我想对外部变量进行阴影处理,但也要将其初始化为与外部变量相同的值。以下是一个例子: 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),但是我

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

我想对外部变量进行阴影处理,但也要将其初始化为与外部变量相同的值。以下是一个例子:

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
的名称,但编译器目前的构建方式无法轻松跟踪它,这将带来额外的麻烦。

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

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


因为这是一个立即调用的函数表达式,所以它的作用域与在其外部编写的代码完全不同。如果不以某种方式传递参数(无论是在执行还是使用bind时直接传递),或者更改函数,使范围成为定义所需变量a的范围,那么就无法完成您所要求的操作

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


您需要将
a
作为参数传递到数据库中

大概是这样的:

var a=2;//全局范围中的变量声明。
(职能(a){
a+=3;
//我希望a是5
console.log(a);//打印本地范围中的当前值。
})(a) ;//参数:var a=2;
控制台信息(a);//打印全局范围中的当前值。

//我希望'a'为2
您需要将
a
作为

大概是这样的:

var a=2;//全局范围中的变量声明。
(职能(a){
a+=3;
//我希望a是5
console.log(a);//打印本地范围中的当前值。
})(a) ;//参数:var a=2;
控制台信息(a);//打印全局范围中的当前值。

//我希望'a'为2
“外部变量”是否始终在全局范围内?如果是的话,事情就容易多了。不,它在当前的范围之外,通常是Yok,所以Danny的答案是go。尽管您所做的可能会让维护代码的任何人感到困惑。引用op
将其作为参数传递不是一个选项
“外部变量”是否总是在全局范围内?如果是的话,事情就容易多了。不,它在当前的范围之外,通常是Yok,所以Danny的答案是go。尽管您所做的可能会让维护代码的人感到困惑。引用op
将其作为参数传递不是一个选项
函数范围无论如何都不能更改。bind用于设置此值,这是一件完全不同的事情。@RobG在将
this
的值作为
bind
方法的第一个参数传递后,您可以将附加参数传递到
bind
方法中,该方法将在调用目标函数时为绑定函数提供参数。此外@RobG函数作用域可以可以通过更改函数的定义方式进行更改。通过定义一个常规函数而不是IIFE,函数可以从外部范围访问
var a
。无论如何,函数范围都不能更改。bind用于设置此值,这是一件完全不同的事情。@RobG在将
this
的值作为
bind
方法的第一个参数传递后,您可以将附加参数传递到
bind
方法中,该方法将在调用目标函数时为绑定函数提供参数。此外@RobG函数作用域可以可以通过更改函数的定义方式进行更改。通过定义一个常规函数而不是IIFE,函数可以从外部范围访问
var a
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));
(function(parameter){
 // «parameter» contains the given value.
 // parameter = "Some value".
})("Some value");