首頁  >  文章  >  web前端  >  對於javascript MDN中let和var範例的認識

對於javascript MDN中let和var範例的認識

黄舟
黄舟原創
2017-03-20 14:37:261586瀏覽

這是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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn