【发布时间】:2013-02-05 16:50:59
【问题描述】:
如果函数有作用域,就应该在那个作用域内执行,但是这里我觉得不一样,看代码:
function foo() {
var privateVal = "Private Val";
this.publicVal = "Public Val";
var privateAlert = function (str) {
alert(str + this.publicVal);
alert(str + privateVal);
}
this.Run = function () //see here
{
privateAlert("Private Call: ");
this.publicAlert = privateAlert;
this.publicAlert("Public Call: ");
privateAlert = this.publicAlert;
privateAlert("Private Call: ");
this.publicAlert("Public Call: ");
}
}
var bar = new foo();
bar.Run();
创建新对象时,Run() 成为对象的公共方法或仅属于 var bar 的方法。该方法不应该能够在其中执行privateAlert() 函数;因为函数有作用域,它只能在它被声明的函数内执行,但是这个函数已经失去了它被创建的作用域并且它仍然被执行。请澄清一下?
【问题讨论】:
-
我什至不明白如何您感到困惑,因此很难指出您的错误。
-
javascript 中没有“私有方法”之类的东西。如果它是对象的属性(可调用),则它可以由任何代码运行。实现“private”的唯一方法是通过闭包,您已经使用“privateAlert”函数完成了此操作。 “运行”相当于 C#/Java 中的公共函数,并且被认为类似于“类成员”。公共成员确实可以在高阶语言中调用私有函数,那么为什么不在这里呢?但是,正如@dystroy 所说,不要很快将 javascript 函数混淆为真正的 OOP 方法
-
闭包经常被误解。您应该研究并了解它们是如何工作的,以加强您对 javascript 函数的了解。
-
不确定这是否是问题的一部分,但
alert(str + this.publicVal);不会按照您的想法去做。privateAlert没有在任何对象上调用,因此this将是null(在严格模式下)或window(在非严格模式下)。你可以阅读更多关于上下文here的信息。
标签: javascript scope