我在理解用JavaScript对象定义的字段的作用域/访问方面遇到问题。
请考虑以下示例JavaScript对象定义:
function SampleObject(controlName) {
var _controlName = controlName;
this.Display1 = function() {
console.log(_controlName);
}
this.Display2 = function() {
Display3();
}
Display3 = function () {
console.log(_controlName);
}
}
现在考虑使用以下示例运行上述对象:
var a = new SampleObject("Bob");
var b = new SampleObject("Fred");
a.Display1(); //==> Displays "Bob"
b.Display1(); //==> Displays "Fred"
a.Display2(); //==> Displays "Fred"
b.Display2(); //==> Displays "Fred"
我很难理解的是如何从我的对象中定义的私有函数中访问对象字段(属性)。 在我的示例中,对于两个对象通过 Display2()显示的 _controlName 为什么具有值“ Fred ”的原因,我感到困惑strong> a 和 b 。
我怀疑这与_ controlName 和/或 Display3()的定义方式有关,或者我不清楚在这种情况下作用域如何工作。有人可以分享一下这个观点吗?
谢谢JohnB
答案 0 :(得分:2)
在其他一些语言中,例如Java(我来自那里),当您在对象的方法内部时,this
是隐式的。在Javascript中,情况并非如此。
当您分配给this.Display1
和this.Display2
时,您正在使用this
所指向的对象上的名称创建属性。由于new
,每次都是一个不同的对象。
但是,当您分配给Display3
时,您正在分配的是全局变量。如果不存在,则会为您创建。当您调用new SampleObject("Fred");
时,原来登录“ Bob”的功能现在已消失,由打印“ Fred”的功能代替。
如果您添加“使用严格”;在您的SampleObject
函数的顶部(它抑制了这种“隐式全局”行为),当您尝试将其分配给从未声明的变量Display3
时,会出现参考错误。
答案 1 :(得分:1)
这是解释。
在第一次调用中,new SampleObject("Bob");
全局变量Display3
被设置为控制台记录值Bob
的函数。
在第二个调用中,将new SampleObject("Fred");
全局变量Display3
设置为控制台记录值Fred
的函数。
现在您的Display1
实际上是一种方法。您创建的每个对象都有其自己的Display1
属性。因此,鲍勃的Display1
日志Bob
和弗雷德的日志Fred
。
但是因为Display2
方法每个都调用全局Display3
方法,所以它们会全部记录Display3
的最后一次分配中记录的功能,并且始终为Fred
。