2012-04-24 2 views
0

Можно ли вызвать возвращаемую функцию, которая создает закрытие, как в моем коде ниже?Закрытие javascript invocation

Чтобы получить доступ к html, мне не нужно делать Bay.HTML()(); ?

Bay.prototype.HTML = function() { 
    var html; 
    return function() { 
     if (!html) { 
      var td = docCreate('td'); 
      td.setAttribute('id', 'bay' + this.number); 
      td.setAttribute('class', 'bay'); 
      html = td; 
     } 
     return html; 
    }(); <----------HERE 
}; 
+0

Что значит «это нормально»? – Zirak

+1

Это выглядит «ОК», но, по моему мнению, сложнее. Почему бы просто не привязать html к экземпляру Bay (whith this.html) и не удалить внутреннее закрытие и много кода? –

ответ

2

Я предполагаю, что вы хотели

Bay.prototype.HTML = (function() { 
    var html; 
    return function() { 
     if (!html) { 
      var td = docCreate('td'); 
      td.setAttribute('id', 'bay' + this.number); 
      td.setAttribute('class', 'bay'); 
      html = td; 
     } 
     return html; 
    }; 
})(); <----------HERE 

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

+0

После того, как я опубликовал это, я понял, что то, что я искал, это способ назначить переменную html один раз, и после каждого вызова данные просто извлекаются из переменной html, поэтому функция не запускается. На самом деле, то, что мне было нужно, это не использовать свойство this._html, а затем иметь функцию prototype.HTML, которая, казалось, немного переборщила. –

1

Это нормально, но это не отличается в

Bay.prototype.HTML = function() { 
    var html; 

    if (!html) { 
     var td = docCreate('td'); 
     td.setAttribute('id', 'bay' + this.number); 
     td.setAttribute('class', 'bay'); 
     html = td; 
    } 
    return html; 
}; 

Это означает твой HTML не кэшируется.

Если вы хотите кэшировать html, то вы хотите:

Bay.prototype.HTML = function() { 

    if (!this.html) { 
     var td = docCreate('td'); 
     td.setAttribute('id', 'bay' + this.number); 
     td.setAttribute('class', 'bay'); 
     this.html = td; 
    } 
    return this.html; 
}; 
1

Это зависит от контекста, в котором вы хотите что-то будет «нормально». Это работает? Если это так, иногда это все, что нужно. Является ли кто-то другим, кто читает ваш код о том, что он делает, поддерживает ли он, безопасно ли это?

Итак, код. Это работает? №

Переменная метода «html» будет инициализирована до нуля каждый раз, когда вызывается эта функция прототипа, поэтому условное значение в вашей внутренней функции всегда будет оцениваться как истина и пройти шаги по настройке элементов dom.

Нужно ли здесь использовать крышу? №

Вы создаете закрытие, которое не будет сохраняться за пределами вызывающего контекста и поэтому бесполезно. Каждый раз, когда вы вызываете Bar.HTML(), вы создаете и уничтожаете дополнительный контекст только для выполнения некоторого кода, так как вы не храните или не возвращаете ссылку на закрытие, чтобы действовать позже. Вы можете просто фактор закрытия из, и получить лучшие результаты исполняющих:

Bay.prototype.HTML = function() { 
    var html; 
    if(!html) { 
     var td = docCreate('td'); 
     td.setAttribute('id', 'bay' + this.number); 
     td.setAttribute('class', 'bay'); 
     html = td; 
    } 
    return html; 
} 

Конечно, с той HTML варом объявляются прямо, если заявление не нужно, но я предполагаю, что это только некоторые примеры кода ,

Вот отличная информация о closures in javascript, когда и как их использовать.

0

@Esailija является правильным. Ваша реализация не кэширует результаты, как вы хотите.

Его решение будет кэшировать его, но это будет публичная собственность. Если вы хотите, чтобы кеширующая версия не делала кэш общедоступным, вы оцениваете неправильную функцию. Чего вы хотите:

Bay.prototype.HTML = (function() { 
    var html; 
    return function() { 
     if(!html) { 
      var td = docCreate('td'); 
      td.setAttribute('id', 'bay' + this.number); 
      td.setAttribute('class', 'bay'); 
      html = td; 
     } 
     return html; 
    }; 
})(); 
+0

Большое спасибо! это именно то, что я искал. Наряду с объяснением/верификацией. Итак, кассовая версия похожа на закрытие? –

+0

It * есть * закрытие. Оцененная анонимная функция снаружи создает область для возвращаемой внутренней функции, которая * закрыта * ко всему, кроме указанной внутренней функции. То, что делалось раньше, не было действительно закрытием, потому что внешний охват «умер» в конце вызова функции. –

+0

Еще одна вещь, которую я только заметил - это то, что я думал, что свойство .HTML залива действует как var, как будто я создал закрытие и набил его в var html. Но действительно каждый раз .HTML() назывался перезаписью. Я не уверен, возможно ли иметь ценность с бай-ином в функции, которая может иметь несколько экземпляров.? –

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