2015-03-24 2 views
1

Я смущен, почему этот ниже код предупреждает только значение 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(); 

ответ

1

Если объявить name в закрытии он будет работать. Я предполагаю, что если вы не объявите эту переменную в своей области, то закрытие всегда будет использовать внешнюю объявленную версию name, которая в вашем примере всегда будет yyy, потому что это последнее значение, на которое оно установлено.

var B = (function() { 
    return function (n) { 
     var name = n || 'David'; 
     this.sayHello = function() { 
      alert("Hi " + name); 
     } 
    } 

})() 

DEMO

Примечание для предотвращения и ошибок создается, если ничего не передается в конструктор, я добавил опцию по умолчанию, «David» в этом случае.

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

+0

Спасибо за усилия по изменению вышеуказанного кода. Но я действительно ищу ответ, который поможет мне понять поведение кода функции закрытия, упомянутое мной, чтобы я мог знать, почему ошибка. –

+0

Значение b1 перезаписывается b2 при вызове нового B («..»), это вызывает вашу проблему. – Sim1

+0

У b1 и b2 нет отдельных ссылок? –

Смежные вопросы