我猜 Raffaele 已经回答了你的大部分问题。但是,为了您的方便,让我尝试以不同的方式表达它并添加一些代码供您遵循。
我认为,您可以在这里学习两件事,以了解您的代码为何如此行事。
JavaScript 具有后期绑定this
。只有当您调用一个方法时,运行时才决定“打开”它将被调用的对象。默认是全局对象(例如,window
在浏览器中、global
在 node.js 中等)。要获得this
除全局之外的另一个,您需要将该函数分配为所需对象的属性,就像您通过this.publicAlert = privateAlert;
. 之后,如果您privateAlert()
直接调用(在 global 上this
)或者如果您在本地 this via 上调用它this.publicAlert()
,即使它是相同的函数,它也会有所不同。
正如在另一个答案中已经指出的那样。Javascript 没有public
,private
等,您需要按照您使用智能范围界定的方式“建模”私有变量。在您的示例privateVal
中,从某种意义上说,这是私有的,没有人可以从外部读取或写入它。这同样适用于privateAlert
。只有通过构造函数中的语句Foo
和run
您可以访问它们的方法。
我扩充了您的示例以向您展示发生了什么(ps: usingconsole.log
通常比 更可取alert
):
function Foo() {
var privateVal = "Private Val";
var that = this;
this.publicVal = "Public Val";
var privateAlert = function (str) {
console.log("---" + str + "---")
console.log("isLocalThis? ", this == that)
console.log("isGlobalThis?", this == globalThis)
console.log("private: ", privateVal)
console.log("public: ", this.publicVal || "publicVal not available on 'this'")
}
this.run = function () {
console.log("scope of run:", that, bar, privateAlert)
console.log("isLocalThis? ", this == that)
console.log("isGlobalThis?", this == globalThis)
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();
顺便说一句:console
和alert
是全局的属性this
(即window
)。