2015-03-30 3 views
1

Вот скрипка:Почему `foo()` работает здесь?

https://jsfiddle.net/5k10h27j/

Почему foo() дозвонились при установке в качестве аргумента в неопределенную функцию?

function foo(){ 
    alert('huh??'); 
} 
jQuery('#container').on('change', 'input', function(e){ 
    console.log('change'); 
}).blahblah(foo()); 
+1

Код должен быть размещен ** здесь **. – Pointy

+0

Почему * не будет * он «работает»? Он выполняет именно то, что запрашивается. – user2864740

+1

'foo()' вызывается до того, как движок js выдает ошибку, связанную с несуществующей функцией. –

ответ

1

Потому что вы это называете. foo(). Вы можете передавать функции без их вызова, как в .blahblah(foo);

+0

Derp. Мне нужен отпуск. – pspahn

2

Функция вызывается перед попыткой найти неопределенную функцию.

В выражении как

objectReference.propertyName(arg1, arg2, arg3) 

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

Here is the relevant portion of the spec. Шаг 3 - это оценка аргументов, а шаг 4 - это тест, чтобы проверить, является ли вещь, которую код говорит для вызова как функции, фактически является функцией.

0

Во-первых, вам нужно определить свою функцию blahblah где-то, и она должна прототип jQuery для использования в цепочке. После того, как вы определили свою функцию с аргументом обратного вызова, вы можете вызвать ее, передав ссылку foo, а не вызов функции.

$.fn.blahblah = function (callback) { 
    callback(); 
    return this; // if you want to keep chaining 
}; 

function foo() { 
    alert('huh??'); 
} 

$('#container') 
    .on('change', function() { 
    console.log('change'); 
    }) 
    .blahblah(foo); 
    // in this case you can keep chaining since blahblah is returning 'this'. 
+0

Я думаю, что op должен был знать, почему он предупреждает «да»? даже несмотря на то, что функции бла-блаха не существует. Как 'why' будет предупреждать в следующем коде:' window.yesIKnowThisDoesNotExistButAlerts (function() {alert ('why');}()) ' – HMR