這是javascript MDN的範例
目的是為了說明let作用域的問題。
var SomeConstructor;{ let privateScope = {}; SomeConstructor = function SomeConstructor () { this.someProperty = "foo"; privateScope.hiddenProperty = "bar"; } SomeConstructor.prototype.showPublic = function () { console.log(this.someProperty); // foo } SomeConstructor.prototype.showPrivate = function () { console.log(privateScope.hiddenProperty); // bar }} var myInstance = new SomeConstructor(); myInstance.showPublic();myInstance.showPrivate(); console.log(privateScope.hiddenProperty); // error
不過通常我們不會這樣定義一個建構子。
所以我改寫了一下。
function SomeConstructor() { this.someProperty = 'foo'; let privateScope = {}; privateScope.hiddenProperty = 'bar'; SomeConstructor.prototype.showPublic = function () { console.log(this.someProperty); } SomeConstructor.prototype.showPrivate = function () { console.log(privateScope.hiddenProperty); }}var myInstance = new SomeConstructor(); myInstance.showPublic(); //foomyInstance.showPrivate(); //barconsole.log(privateScope.hiddenProperty); //ReferenceError: privateScope is not defined
可以看到我們無法直接存取 privateScope.hiddenProperty, 如果我們這麼改。
var privateScope = {}; // 把let 换成var
則結果變成
console.log(privateScope.hiddenProperty); //ReferenceError: privateScope is not defined
可以看到結果不變。
在建構函數中無論是 var 或 let 其作用域是相同的,而且都是私有變數。
我們還是用MDN裡面的範例,把let改成var
var SomeConstructor;{ var privateScope = {}; SomeConstructor = function SomeConstructor () { this.someProperty = "foo"; privateScope.hiddenProperty = "bar"; } SomeConstructor.prototype.showPublic = function () { console.log(this.someProperty); // foo } SomeConstructor.prototype.showPrivate = function () { console.log(privateScope.hiddenProperty); // bar }} var myInstance = new SomeConstructor(); myInstance.showPublic(); myInstance.showPrivate(); console.log(privateScope.hiddenProperty); // bar
則可以看到console.log有結果輸出而不是error.
##但是一般情況下我們還是用常用的模式去定義一個建構子。這個範例是為了特地講let 和 var區別才寫出的。所以沒有代表性。在常用的模式之下,是看不出let 和 var的區別的,他們都是建構函數的私有變數且作用域相同。
以上是對於javascript MDN中let和var範例的認識的詳細內容。更多資訊請關注PHP中文網其他相關文章!