2015-05-03 3 views
1

Может кто-нибудь объяснить параметр e в анонимном вызове функции. Я не могу понять, как анонимная функция принимает параметр (вторая строка в приведенном ниже коде). Этот код взят от DropZone.анонимный вызов функции javascript с параметром

updateProgress = (function(_this) { 
    return function(e) { 
     var allFilesFinished, progress, _j, _k, _l, _len1, _len2, _len3, _results; 
     if (e != null) { 
     progress = 100 * e.loaded/e.total; 
     for (_j = 0, _len1 = files.length; _j < _len1; _j++) { 
      file = files[_j]; 
      file.upload = { 
      progress: progress, 
      total: e.total, 
      bytesSent: e.loaded 
      }; 
     } 
     } else { 
     allFilesFinished = true; 
     progress = 100; 
     for (_k = 0, _len2 = files.length; _k < _len2; _k++) { 
      file = files[_k]; 
      if (!(file.upload.progress === 100 && file.upload.bytesSent === file.upload.total)) { 
      allFilesFinished = false; 
      } 
      file.upload.progress = progress; 
      file.upload.bytesSent = file.upload.total; 
     } 
     if (allFilesFinished) { 
      return; 
     } 
     } 
     _results = []; 
     for (_l = 0, _len3 = files.length; _l < _len3; _l++) { 
     file = files[_l]; 
     _results.push(_this.emit("uploadprogress", file, progress, file.upload.bytesSent)); 
     } 
     return _results; 
    }; 
    })(this); 

это то, как он относится к OnProgress

progressObj = (_ref = xhr.upload) != null ? _ref : xhr; 
    progressObj.onprogress = updateProgress; 

, то это называется, как

updateProgress(); 
+0

Да, я знаю, что «это» идет в конце ... но как это передается функции ... и как это узнать? – whatever

+0

Это не имеет никакого отношения к 'this'. –

+0

Да, это то, что я говорю .. это не имеет никакого отношения к этому .. так кто звонит этой функции или говорит, кто может ее назвать .. ее оператор возврата ..: o – whatever

ответ

0

Независимо вызовыupdateProgress будет проходить аргумент, который затем можно ссылаться через e.

Пример:

updateProgress(42): e теперь будет ссылаться на 42.

Скорее всего updateProgress будет использоваться как обработчик событий, поэтому e будет ссылаться на объект события.

+0

Вы правильно проверили код. Функция вызывается в конце с параметром 'this' as. но как анонимная функция в возврате знает об этом определении? – whatever

+0

* «Функция вызывается в конце с этим параметром». * Да, но это не имеет значения. Функция возвращает другую функцию ('return function (e) {...}'), и это значение, присвоенное 'updateProgress'. 'updateProgress' - это функция, определяющая' e' как аргумент. Как вы думаете, 'return function() {...};' делает? –

+0

Я в замешательстве. Так почему же это? – whatever

2

Выражения функции используются только для создания области видимости. Функция, которая возвращается из IIFE (сразу вызывается выражением функции) присваивается updateProgress varible, так что конечный результат в основном, как если бы вы имели регулярную функцию с параметром:

function updateProgress(e) { 
    var allFilesFinished, ... 
    ... 
    return _results; 
} 

Когда updateProgress используется как обработчик события, он будет вызываться с объектом события в качестве первого параметра. Это заканчивается параметром e.

При вызове без значения параметр e получает значение undefined. Это заставляет код выполнять часть else, то есть показывая прогресс на 100%.

+0

, так значит, 'this' присваивается ему как параметр? – whatever

+0

@ whatever: Нет, 'this', который отправляется в IIFE, попадает в параметр' _this', который позже используется в функции. Это похоже на использование метода ['bind'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind), чтобы установить контекст для функции. – Guffa

+0

хорошо получилось ..: D – whatever

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