在JavaScript中从执行上下文检索值
我认为第二个日志返回undefined的原因是因为window[“outer_funct”]引用了函数对象,而函数对象没有与其关联的属性“value”。相反,我想做的是在调用window[“outer_funct”]时引用执行上下文。这是否可以在内部函数的执行上下文中执行?在JavaScript中从执行上下文检索值,javascript,scope,Javascript,Scope,我认为第二个日志返回undefined的原因是因为window[“outer_funct”]引用了函数对象,而函数对象没有与其关联的属性“value”。相反,我想做的是在调用window[“outer_funct”]时引用执行上下文。这是否可以在内部函数的执行上下文中执行?var value=30是函数外部函数中的局部变量,无法从此函数外部访问它 在您的代码中,虽然winodw[“outer_funct”][“value”]写在internal_funct内部,但它的作用就像是试图从outer_
var value=30
是函数外部函数
中的局部变量,无法从此函数外部访问它
在您的代码中,虽然winodw[“outer_funct”][“value”]
写在internal_funct
内部,但它的作用就像是试图从outer_funct
外部访问局部变量,因为通过“window['outer_funct]”您处于顶层
我认为第二个日志返回undefined的原因是因为window[“outer_funct”]引用了函数对象,而函数对象没有与其关联的属性“value”
对
相反,我想做的是在调用window[“outer_funct”]时引用执行上下文。这是否可以在内部函数的执行上下文中执行
不,不是因为您已经隐藏了值
(在内部函数
中声明了它)。你没有办法得到它的符号已被覆盖这样。当然,您可以将其放入另一个符号中:
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();
如果没有对其进行阴影处理,则可以在包含的上下文中引用value
,例如:
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();
值得注意的是,原始代码的
window[“value”]
返回10
(顺便说一句,您也可以使用window.value
)的唯一原因是var值=10代码>处于全局范围。使用var
声明的所有变量都成为全局对象的属性,在浏览器上通过window
引用全局对象(从技术上讲,window
本身只是全局对象上指向全局对象的一个属性)。不能使用window[“outer\u 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();
另一种方法是,如果您没有在internal\u funct
中隐藏值
。如果没有名为相同内容的变量,可以记录它,它将返回20
。但是,由于您在内部函数
中创建了另一个名为值
的变量,它将在外部函数
中对值
进行阴影处理
我还想问,为什么需要在三个作用域中使用三个名称完全相同的变量。不,在JavaScript中访问非全局阴影变量是绝对不可能的
您也无法获取函数的执行上下文,它是一个依赖于实现的内部值()-您是正确的,您的代码正在查找函数对象的属性
全局范围中的变量可以作为全局对象的属性访问(浏览器中的窗口),但如果要对局部变量进行阴影处理,则唯一的选择是重命名自己的投射阴影的变量。局部变量是不可访问的,这也是因为它们可能取决于函数的执行(如果函数从未执行过,您如何访问该变量?)
如果你真的需要一些技巧,你可以看看这个:
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();
请注意,必须先执行函数,然后才能使用可访问的方法。变量不会成为定义它们的函数的属性。不包括窗口
对象(在全局声明它们的情况下)没有可以访问本地定义变量的对象。其他答案建议了一些变通方法,但它们仍然证明了JavaScript无法在您向我们展示的实际环境中执行这样的任务。@DanielImms我同意您的看法,我不同意。这更像是一个假设性的例子我试图理解这在JS中是否可行。抱歉,我不确定我是否完全理解。你能进一步解释一下吗?我的意思是无法从函数外部访问函数的局部变量。@t-j-crowder谢谢你的解释,这非常清楚,正是我要找的解释!
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"