2016-06-03 2 views
3

Сегодня во время проверки исходного кода Жасмин here я наткнулся на следующее:Function.prototype.apply.apply - зачем называть это дважды

if (queueableFn.timeout) { 
    timeoutId = Function.prototype.apply.apply(self.timeout.setTimeout, [j$.getGlobal(), [function() { 
     var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.'); 
     onException(error); 
     next(); 
    }, queueableFn.timeout()]]); 
} 

Я заинтересован в том, почему apply называется здесь дважды prototype.apply.apply

+0

незнанию я предполагаю : 'Function.prototype.apply.apply == Function.apply' я использую' eval.apply' для захвата 'apply()' (они все одинаковые), когда никто не смотрит, как скрипт командной строки. .. – dandavis

+0

извините, не понял вас, незнание кого? –

+0

, кто когда-либо писал код, не знает, как работает js, вот и все ... – dandavis

ответ

3

commit that introduced this syntax объясняет все:

Старый IE фиксирует все еще не зеленый, но уже близко. Резюме пожилых IE несоответствия:

  • Старые IE не применяется/вызов функции синхронизации
  • Старые IE не позволяет применять falsy аргументы
  • Старые IE не позволяют установить OnClick неопределенных значений
  • Старые IE не имеет свойства текста на Dóm узлах
+0

вы можете подробно рассказать о том, как это работает? 'Function.prototype.apply' возвращает функцию native apply, а затем, когда на нее вызывается метод apply, следует вызывать' Function.prototype.apply', а не 'setTimeout', который передается как контекст –

+1

@Maximus:' apply. apply (fn, [ctx, args]) 'по существу эквивалентен' fn.apply (ctx, args) ', за исключением случая, когда' fn.apply! == apply' (точно так же, как это опять-таки эквивалентно 'ctx .fn (... args) ', за исключением того, что' ctx.fn' обычно не 'fn'). – Bergi

+0

Мне трудно понять, как _apply.apply (fn, [ctx, args]) по существу эквивалентен fn.apply (ctx, args) _, что мне нужно знать, чтобы понять это? –