视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
对于javascriptMDN中let和var范例的认识
2020-11-27 20:23:52 责编:小采
文档

这是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的区别的,他们都是构造函数的私有变量且作用域相同。

下载本文
显示全文
专题