1

我对 javascript 对象还很陌生,我可以对调用变量进行一些澄清。我正在尝试在 bar 函数中调用测试变量。这可能吗?如果是这样,我将如何正确地做到这一点?

var foo = {

    bar: function()
    {
        var test = 'Hello World';
    },

    speak: function()
    {
        // Log the Variable from above ^^
        console.log(foo.bar.test);
    }

};

谢谢

4

4 回答 4

2

不; 局部变量在其声明函数之外是不可见的。

相反,您需要向对象添加一个属性:

foo.test = ...;

你也可以设置foo.bar.test;这将为函数对象添加一个属性。

于 2012-09-20T17:34:51.720 回答
1

当您在函数内部声明一个局部变量时,您将其添加到VariableEnvironment函数中(这与外部函数本质上没有区别LexicalEnvironment,但 ECMA 将它们区分开来)。该函数具有对LexicalEnvironment声明它的作用域的引用(在我们的例子中,是全局对象window)。当您尝试从函数内部引用变量时,引擎首先在函数的本机中搜索它VariableEnvironment,然后,如果未找到,则在外部LexicalEnvironment. 在您的情况下,您尝试从函数外部引用一个变量,因此引擎一开始就在全局对象的范围内搜索它。

因此,要完成您的任务,您应该在外部 scrope 中声明变量,然后在函数内部分配它,或者您应该向对象添加一个新属性,然后引用它:

var foo = {
    test: 'Hello world',
    speak: function()
    {
        console.log(this.test);
    }

};
于 2012-09-20T17:51:23.513 回答
0

为了以这种方式访问​​变量 test,您需要将其定义为对象的属性,如下所示:

var foo = {
    test: 'Hello World, before calling bar()',
    bar: function()
    {
        this.test = 'Hello World';
    },
    speak: function()
    {
        // Log the Variable from above ^^
        console.log(this.test);
    }
};
console.log(foo.test);

我还使用关键字 this 更改了访问对象 foo 的函数。它通常会起作用,但有时在 javascript 中跟踪您的范围可能会很棘手,所以请尽量注意这一点。

于 2012-09-20T17:40:20.780 回答
0

您可以通过在调用 bar 方法时返回它来访问测试。

var foo = {

    bar: function()
    {
        var test = 'Hello World';
       return test;
    },

    speak: function()
    {
        // Log the Variable from above ^^
        console.log(foo.bar());
    }

};
于 2012-09-20T17:38:52.330 回答