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