对于javascript MDN 中let 和var范例的认识

这是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();//foo
myInstance.showPrivate(); //bar
console.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的区别的,他们都是构造函数的私有变量且作用域相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值