var value = 10;
var outer_funct = function(){
var value = 20;
var inner_funct = function(){
var value = 30;
console.log(value); // logs 30
console.log(window["outer_funct"]["value"]); // What I would like to log here is the value 20.
console.log(window["value"]); // logs 10
};
inner_funct();
};
outer_funct();
我认为第二个日志返回undefined的原因是因为window [“outer_funct”]引用了函数对象,而函数对象没有与之关联的属性“value”。相反,我想要做的是在调用window [“outer_funct”]时引用执行上下文。这是否可以在inner_funct的执行上下文中进行?
答案 0 :(得分:1)
我认为第二个日志返回undefined的原因是因为window [“outer_funct”]引用了函数对象,而函数对象没有与之关联的属性“value”。
正确。
相反,我想要做的是在调用window [“outer_funct”]时引用执行上下文。这是否可以在inner_funct的执行上下文中进行?
不,不是因为你有value
(在inner_funct
中声明)。你无法用那个被覆盖的符号来达到它。当然,你可以把它抓到另一个符号:
var value = 10;
var outer_funct = function(){
var value = 20;
var outer_value = value;
var inner_funct = function(){
var value = 30;
console.log(value); // logs 30
console.log(outer_value); // logs 20
console.log(window.value); // logs 10
};
inner_funct();
};
outer_funct();
如果你没有隐藏它,那么你可以在包含的上下文中引用value
,例如:
var value1 = 10;
var outer_funct = function(){
var value2 = 20;
var inner_funct = function(){
var value3 = 30;
console.log(value3); // logs 30
console.log(value2); // logs 20
console.log(value1); // logs 10
};
inner_funct();
};
outer_funct();
值得注意的是,您的原始代码window["value"]
返回10
(顺便说一下,您还可以使用window.value
)的唯一原因是var value = 10;
位于全球范围内。用var
声明的所有变量都成为全局对象的属性,在浏览器上通过window
引用它(从技术上讲,window
本身只是指向全局对象的属性到全球对象)。
答案 1 :(得分:1)
由于您提到的原因,您无法使用value
完全引用window["outer_funct"]
。你能做的就是这样:
var value = 10;
var outer_funct = function(){
var context = {// you can put multiple values in here
value: 20;
}
var inner_funct = function(){
var value = 30;
console.log(value); // logs 30
console.log(context.value); //logs 20
console.log(window["value"]); // logs 10
};
inner_funct();
};
outer_funct();
另一种方法是,如果你没有在value
内隐藏inner_funct
。如果您没有名为相同的变量,则可以记录它并返回20
。但是,由于您在value
中创建了另一个名为inner_funct
的变量,这将隐藏value
中outer_funct
的值。
我还会质疑为什么你需要在三个范围内有三个完全相同的变量。
答案 2 :(得分:0)
var value = 30;
是函数outer_funct
中的局部变量,无法从此函数外部访问它。
在您的代码中,虽然winodw["outer_funct"]["value"]
写在inner_funct
内,但它会尝试从outer_funct
中访问本地变量,因为`window [' outer_funct&# 39;]你留在顶层。
答案 3 :(得分:0)
不,在JavaScript中访问非全局阴影变量是绝对不可能的。
您也无法获取函数的执行上下文,它是依赖于实现的内部值(specification type) - 您是正确的,您的代码正在查找函数对象的属性。
全局范围中的变量可以作为全局对象的属性(浏览器中为window
)进行访问,但如果要隐藏局部变量,则唯一的选择是重命名自己的变量以投射阴影。 / p>
答案 4 :(得分:0)
本地变量是不可访问的,也因为它们可以依赖于函数执行(如果函数从未被执行过,如何访问该变量?)。
如果你真的需要一些技巧,你可以看一下:
var person = function () {
// Private
var name = "Robert";
return {
getName : function () {
return name;
},
setName : function (newName) {
name = newName;
}
};
}();
alert(person.name); // Undefined
alert(person.getName()); // "Robert"
person.setName("Robert Nyman");
alert(person.getName()); // "Robert Nyman"
并注意必须先执行该函数才能使用可访问的方法。
答案 5 :(得分:0)
变量不会成为您定义它们的函数的属性。排除window
对象(在全局声明它们的情况下),没有对象可以访问本地定义的变量。其他答案提出了一些解决方法,但它们仍然证明了JavaScript在您向我们展示的实际环境中无法执行此类任务。