在JavaScript中从执行上下文检索值

在JavaScript中从执行上下文检索值,javascript,scope,Javascript,Scope,我认为第二个日志返回undefined的原因是因为window[“outer_funct”]引用了函数对象,而函数对象没有与其关联的属性“value”。相反,我想做的是在调用window[“outer_funct”]时引用执行上下文。这是否可以在内部函数的执行上下文中执行?var value=30是函数外部函数中的局部变量,无法从此函数外部访问它 在您的代码中,虽然winodw[“outer_funct”][“value”]写在internal_funct内部,但它的作用就像是试图从outer_

我认为第二个日志返回undefined的原因是因为window[“outer_funct”]引用了函数对象,而函数对象没有与其关联的属性“value”。相反,我想做的是在调用window[“outer_funct”]时引用执行上下文。这是否可以在内部函数的执行上下文中执行?

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"