2017-01-19 1 views
0

Я читал статью об обертывании функций и натолкнулся на этот пример, в котором показано, как можно обернуть функцию для определения ее производительности.Может ли кто-нибудь объяснить, как эта переданная функция возвращается и вызывается? - Javascript

function profile(func, funcName) { 
    return function() { 
    var start = new Date(), 
     returnVal = func.apply(this, arguments), 
     end = new Date(), 
     duration = stop.getTime() - start.getTime(); 

    console.log(`${funcName} took ${duration} ms to execute`); 
    return returnVal; 
    }; 
} 

var profiledMax = profile(Math.max, 'Math.max'); 
profiledMax.call(Math, 1, 2); 
// => "Math.max took 2 ms to execute" 

Я смущен, потому что эти строки:

returnVal = func.apply(this, arguments), 

и:

return returnVal; 

Путь я смотрю на него, когда вы звоните профиля (Math.max. ..), который вернет анонимную функцию, так как же эту анонимную функцию можно вызвать с помощью аргументов? Я бы подумал, что вам нужно будет вернуться, а затем вызвать эту анонимную функцию, чтобы получить доступ к returnVal, который также является функцией? Как это:

var profiledMax = profile(Math.max, 'Math.max'); 
var moreProfiledMax = profiledMax(); 
moreProfiledMax.call(Math, 1,2) 
+1

Возвращенная анонимная функция переносит аргументы, которые будут переданы функции, которую вы хотите протестировать (profiledMax хранит эту возвращенную функцию, поэтому при вызове profiledMax функция получает аргументы). Выполняя 'returnVal = func.apply (this, arguments)', код вызывает 'func' с контекстом (this) и всеми аргументами, которые вы предоставите при его вызове. Он сохраняет результат выполнения в 'returnVal', так что возвращаемая функция может возвращать то же значение, что и те, которые вы хотите проверить. Опасайтесь, кажется, что есть ошибки, вы определяете 'end' var и используете' stop'. – Kaddath

ответ

1

Ok это очень просто, сначала вы получили эту функцию, обертка другая функция

function profile(func, funcName) { 
    return function() { 
    var start = new Date()**;** 
     returnVal = func.apply(this, arguments)**;** 
     end = new Date()**;** 
     duration = stop.getTime() - start.getTime(); 

    console.log(`${funcName} took ${duration} ms to execute`); 
    return returnVal; 
    }; 
} 

эта линия:

var profiledMax = profile(Math.max, 'Math.max'); 

выполнить функцию Outter передавая ему аргументы, которые будут сохранены в рамках внутренняя функция, определяемая функцией outter. И, наконец, внутренняя функция возвращается, как если бы вы были:

var profiledMax = function() { 
     var start = new Date(); 
      returnVal = **Math.max**.apply(this, arguments); 
      end = new Date(); 
      duration = stop.getTime() - start.getTime(); 

     console.log(`${funcName} took ${duration} ms to execute`); 
     return returnVal; 
     } 

, а затем эту строку:

profiledMax.call(Math, 1, 2); 

выполняет profiledMax передавая ему 2 аргумента (вы можете передать аргументы любой функции в JS) и связывание this ключевое слово для объекта Math, как если бы эта функция была выполнена:

function() { 
    var start = new Date(), 
     returnVal = Math.max.apply(**Math**, arguments), 
     end = new Date(), 
     duration = stop.getTime() - start.getTime(); 

    console.log(`${funcName} took ${duration} ms to execute`); 
    return returnVal; 
    }; 

проблема с вашим предложением, когда вы делаете это: var moreProfiledMax = profiledMax();returnVal = func.apply(this, arguments); сломается, потому что func не будет существовать в области.

+0

Спасибо, разделить его определенно помогает. Тогда последний вопрос, почему нужен «return returnVal»? – Olyvar

+0

добро пожаловать! Действительно, возвращение returnVal не имеет отношения к вашему делу :) –

+0

ah отличное спасибо! – Olyvar

1

returnVal не является функцией, а является результатом вызова func. Метод apply будет выполнять метод, в отличие от bind, который вернет функцию.

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