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

时间:2013-03-30 15:58:40

标签: javascript scope

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的执行上下文中进行?

6 个答案:

答案 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的变量,这将隐藏valueouter_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在您向我们展示的实际环境中无法执行此类任务。