2015-12-11 4 views
1

Функция задержки: Задерживает функцию для заданного количества миллисекунд, а затем вызывает ее с предоставленными аргументами.Попытка понять синтаксис функции задержки

написан на основе подчеркивания js. аннотированный источник:

_.delay = function(func, wait) { 
    var args = slice.call(arguments, 2); 
    return setTimeout(function(){ 
     return func.apply(null, args); 
    }, wait); 
    }; 

для функции задержки на работу, почему мы должны использовать метод срезов и вызов (аргументы, 2), что делает эту часть сделать? Пожалуйста, исправьте меня, если я ошибаюсь. функция задержки сначала возвращает setTimeout для выполнения задержки, а функция setTimeout возвращает func.apply (null, args) для передачи всей информации от одной функции к другой? но что здесь означает «null»?

при вызове функции с помощью задержки, он говорит:

var log = _.bind(console.log, console); 
_.delay(log, 1000, 'logged later'); 
=> 'logged later' // Appears after one second. 

им не уверен, как дополнительный аргумент «вошли позже» работает здесь, так как им не уверен, как связать метод работает здесь либо? не могли бы вы дать мне более простой пример?

+2

Все это делает удалить два первых аргумента, функции и времени, а затем вызывает переданному в функцию после заданного времени, с любыми другими передаваемыми аргументами после первых двух. – adeneo

ответ

0

setTimeout выполняет код в window контексте, поэтому вам необходимо позаботиться о том, чтобы обеспечить правильную ссылку для this в функции обратного вызова. _.bind делает это за вас.

var MyObject = function() { 

    this.myVariable = 'accessible'; 

    this.myMethod = function(message) { 
    console.log((this === window)); 
    console.log(message + this.myVariable); 
    } 

} 

var myObject = new MyObject(); 

// it will throw an error, because the this.myVariable isn't accessible 
_.delay(myObject.myMethod, 1000, 'the correct scope is: '); 

// this will be binded to the correct scope 
_.delay(_.bind(myObject.myMethod, myObject), 1000, 'the correct scope is: '); 
Смежные вопросы