我猜 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)。