功能行为混乱

时间:2015-03-24 15:16:47

标签: javascript

我很困惑,为什么这个下面的代码只提醒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();

2 个答案:

答案 0 :(得分:1)

如果在闭包内声明name,它将起作用。我的猜测是,如果你不在其范围内声明该变量,那么闭包将始终使用name的外部声明版本,在您的示例中,yyy始终为var B = (function () { return function (n) { var name = n || 'David'; this.sayHello = function () { alert("Hi " + name); } } })() ,因为这样做了它设置的最后一个值。

{{1}}

DEMO

注意,为了防止在没有任何内容传递给构造函数的情况下创建错误,我添加了一个默认选项,' 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,从而导致您注意到的奇怪行为。

Demo