【问题标题】:Retrieving values from Execution Contexts in JavaScript从 JavaScript 中的执行上下文中检索值
【发布时间】:2013-03-30 15:58:39
【问题描述】:
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"] 引用了函数对象,而函数对象没有与之关联的属性“值”。相反,我想做的是在调用 window["outer_funct"] 时引用 执行上下文。这可以在 inner_funct 的执行上下文中完成吗?

【问题讨论】:

  • @DanielImms 我同意你的观点,我不同意。这更像是一个假设的例子,我试图了解这在 JS 中是否可行。

标签: javascript scope


【解决方案1】:

我认为第二个日志返回 undefined 的原因是 window["outer_funct"] 引用了函数对象,而函数对象没有与之关联的属性“值”。

正确。

相反,我想做的是在调用 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 本身只是指向全局对象的全局对象的属性)。

【讨论】:

  • @t-j-crowder 感谢您的解释,这很清楚,正是我正在寻找的解释!
【解决方案2】:

由于您提到的原因,您不能使用window["outer_funct"] 引用value。你可以做的是这样的:

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();

另一种方法是,如果您没有在 inner_funct 中隐藏 value。如果你没有一个变量命名相同的东西,你可以记录它,它会返回20。但是由于您在inner_funct 中创建了另一个名为value 的变量,这将影响outer_functvalue 的值。

我还会质疑为什么您需要在三个范围内拥有三个完全相同命名的变量。

【讨论】:

    【解决方案3】:

    局部变量是不可访问的,也是因为它们可以依赖于函数的执行(如果函数从未执行过,你怎么能访问那个变量?)。

    如果你真的需要一些技巧,你可以看看这个:

    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"
    

    请注意,必须先执行该函数,然后才能使用可访问的方法。

    【讨论】:

      【解决方案4】:

      不,在 JavaScript 中访问非全局阴影变量是绝对不可能的。

      您也无法获取函数的执行上下文,它是一个依赖于实现的内部值 (specification type) - 您是对的,您的代码正在寻找函数对象的属性。

      全局范围内的变量可以作为全局对象的属性访问(浏览器中的window),但是如果您要对局部变量进行阴影化,您唯一的选择就是重命名您自己的投射阴影的变量。

      【讨论】:

        【解决方案5】:

        var value = 30; 是函数outer_funct 中的局部变量,无法从该函数外部访问。

        在您的代码中,虽然winodw["outer_funct"]["value"] 写在inner_funct 内部,但它的作用是尝试从outer_funct 之外访问局部变量,因为通过`window['outer_funct'] 您处于顶层。

        【讨论】:

        • 对不起,我不确定我是否完全遵循。你能解释一下吗?
        • 我的意思是没有办法从函数外部访问函数的局部变量。
        【解决方案6】:

        变量不会成为定义它们的函数的属性。排除 window 对象(在它们被全局声明的情况下)没有可以访问本地定义变量的对象。有其他答案建议的解决方法,但它们仍然证明 JavaScript 在您向我们展示的实际情况下无法执行此类任务。

        【讨论】:

          猜你喜欢
          • 2015-01-28
          • 2010-10-19
          • 2018-03-27
          • 1970-01-01
          • 2014-01-27
          • 1970-01-01
          • 2023-03-16
          相关资源
          最近更新 更多