我很困惑,为什么这个下面的代码只提醒b2值.b1会发生什么?需要帮助
var B = (function(){
var name = "";
return function(n){
name = n;
this.sayHello = function(){
alert("Hi " + name);
}
}
})()
var b1 = new B("xxx");
var b2 = new B("yyy");
b1.sayHello();
b2.sayHello();
答案 0 :(得分:1)
如果在闭包内声明name
,它将起作用。我的猜测是,如果你不在其范围内声明该变量,那么闭包将始终使用name
的外部声明版本,在您的示例中,yyy
始终为var B = (function () {
return function (n) {
var name = n || 'David';
this.sayHello = function () {
alert("Hi " + name);
}
}
})()
,因为这样做了它设置的最后一个值。
{{1}}
注意,为了防止在没有任何内容传递给构造函数的情况下创建错误,我添加了一个默认选项,' David'在这种情况下。
答案 1 :(得分:0)
要测试的正确代码如下:
var B = (function(){
var name = "";
return function(n){
name = n;
this.sayHello = function(){
alert("Hi " + name);
}
}
})()
var b1 = new B("xxx");
b1.sayHello();
var b2 = new B("yyy");
b2.sayHello();
如果您拨打var b1 = new B("xxx");
然后var b2 = new B("yyy");
,则会覆盖变量name
,从而导致您注意到的奇怪行为。