Почему эти два javascript-функции не эквивалентны?

Эта функция работает:

function refreshCodeMirror(){ $("textarea").each(function(){ var codeMirror = $(this).data('codeMirror'); setTimeout(function(codeMirror){ return function () { codeMirror.refresh(); } }(codeMirror), 10) }); } 

Но когда я попытался упростить это:

 function refreshCodeMirror(){ $("textarea").each(function(){ var codeMirror = $(this).data('codeMirror'); setTimeout(codeMirror.refresh, 10) }); } 

Упрощение не работает.

Некоторые (возможно, нерелевантные) контексты:

Функция refreshCodeMirror вызывается в onclick для заголовка закладки начальной загрузки внутри шаблона django:

  
{% for field in form_tab_fields %}
{{ field }} {{ field.errors }}
{% endfor %}

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

Проблема в том, что вы теряете контекст.

Функции, которые не вызываются непосредственно на объект и не привязаны вручную к контексту, вызываются в глобальном контексте.

 var obj = { print: function() { document.write('
' + this + '

'); } }; obj.print(); var p = obj.print; p();