【问题标题】:Issue with calling javascript objects调用 javascript 对象的问题
【发布时间】:2012-09-13 03:00:34
【问题描述】:
我对 javascript 对象还很陌生,我可以对调用变量做一些澄清。我正在尝试在 bar 函数中调用测试变量。这可能吗?如果是这样,我将如何正确地做到这一点?
var foo = {
bar: function()
{
var test = 'Hello World';
},
speak: function()
{
// Log the Variable from above ^^
console.log(foo.bar.test);
}
};
谢谢
【问题讨论】:
标签:
javascript
oop
variables
object
【解决方案1】:
没有;局部变量在其声明函数之外是不可见的。
相反,您需要为对象添加一个属性:
foo.test = ...;
你也可以设置foo.bar.test;这将为函数对象添加一个属性。
【解决方案2】:
当你在函数内部声明一个局部变量时,你将它添加到函数的VariableEnvironment 中(这与外部的LexicalEnvironment 本质上没有区别,但是ECMA 区分了它们)。该函数引用了声明它的作用域的LexicalEnvironment(在我们的例子中,全局对象或窗口)。当您尝试从函数内部引用变量时,引擎首先在函数的原生VariableEnvironment 中搜索它,然后如果没有找到,则在外部LexicalEnvironment 中搜索。在您的情况下,您尝试从函数的外部引用一个变量,因此引擎一开始就在全局对象的范围内搜索它。
所以,要完成你的任务,你应该在外部范围中声明变量,然后在函数内部分配它,或者你应该给对象添加一个新属性,然后引用它:
var foo = {
test: 'Hello world',
speak: function()
{
console.log(this.test);
}
};
【解决方案3】:
您可以通过在调用 bar 方法时返回它来访问测试。
var foo = {
bar: function()
{
var test = 'Hello World';
return test;
},
speak: function()
{
// Log the Variable from above ^^
console.log(foo.bar());
}
};
【解决方案4】:
为了以这种方式访问变量 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 中跟踪您的范围可能会很棘手,所以请尽量注意这一点。