2013-06-14 5 views
0

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

function embedGameSwfAfterReg() { 
    embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars}); 
} 
API.registerOnload(embedGameSwfAfterReg()) 

и

API.registerOnload(function() { 
    embedGameSwfAfterReg("{$swfLocation}", "100%", "100%", {$flashVars}); 
}); 
+0

Что вы думаете '()' означает? – SLaks

ответ

2

В первом блоке коды, вы регистрируя результат embedGameSwfAfterReg функции (неопределенной) в качестве функции OnLoad (() означает, что вы вычисление функции). Удалите круглые скобки, чтобы иметь функцию embedGameSwfAfterReg сам зарегистрирован:

API.registerOnload(embedGameSwfAfterReg) 
+0

ах, да. идеально. благодаря! – Aks

0

Это

API.registerOnload(embedGameSwfAfterReg()) 

работает embedGameSwfAfterReg, а затем передает возвращаемое значение (undefined, так как она не возвращает значение), чтобы registerOnLoad

вы хотите

API.registerOnload(embedGameSwfAfterReg) 

, который передает функцию непосредственно на registerOnload

Функции являются объектами в Javascript и могут передаваться непосредственно по их именам. Когда вы добавляете parens, вместо этого она запускает функцию и передает результат.

0
function embedGameSwfAfterReg() { 
    embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars}); 
} 
API.registerOnload(embedGameSwfAfterReg) 

и

API.registerOnload(function() { 
    embedGameSwfAfterReg("{$swfLocation}", "100%", "100%", {$flashVars}); 
}); 

будет работать таким же образом. Разница (), которую вы положили с помощью функции embedGameSwfAfterReg в первом случае Фактически она называет функцию там только, но ее отличие во втором случае.

0

Я asssuming, что второй пример должен быть

API.registerOnload(function() { 
    embedGameSwf("{$swfLocation}", "100%", "100%", {$flashVars}); 
}); 

Если это так, то разница довольно большая. В первом случае вызывается функция embedGameSwfAfterReg, и при регистрации вызывается embedGameSwf. Вероятно, это не то, что вы хотите, поскольку возвращаемое значение функции равно undefined.

Во втором случае анонимная функция не вызывается до тех пор, пока не будет возбуждено событие registerOnLoad. Это, вероятно, то, что вы хотите.

0

API.registerOnload() выполняет функцию обратного вызова как параметр, поэтому вам нужно передать только имя функции в качестве ссылки, иначе функция будет вызвана непосредственно при запуске кода.

// Correct form is: 
API.registerOnload(embedGameSWFAfterReg) 

Ваш второй образец уже анонимная функция, которая обрабатывается как функция обратного вызова, и поэтому оценивается при API.registerOnload (обратный вызов) называет ссылку с callback() где-то внутри его код.

0

Краткий ответ: Первая часть кода ничего не делает, поскольку embedGameSwfAfterReg не имеет оператора возврата. Вероятно, это может даже закончиться ошибкой, если API.registerOnload точно не проверяет свои аргументы перед выполнением.

Вторая часть кода создает анонимную функцию, которая передается как аргумент метода API.registerOnload, который (насколько я могу видеть из имени метода) запускает функции во время события Onload.

Длинный ответ: В первой части кода вы объявляете новую функцию под названием embedGameSwfAfterReg, которая противостоит в глобальной области видимости вашего кода:

function embedGameSwfAfterReg() { 
    // calls embedGameSwf function 
} 

после, вы выполняете определенную функцию и передать результат методу registerOnload прицельного с именем API:

API.registerOnload(embedGameSwfAfterReg()); 

Как вы, наверное, уже упоминалось, объявлена ​​функция embedGameSwfAfterReg не возвращает заявление, поэтому результат ее е xecution будет неопределенным. Другими словами

API.registerOnload(embedGameSwfAfterReg()); 

делает то же самое, как

embedGameSwfAfterReg(); 
API.registerOnload(); 

так в конце концов, он вызывает API.registerOnload() без каких-либо аргументов, переданных!

Вторая часть кода создает анонимную функцию (Функции - это конкретные объекты в JS, которые могут быть переданы другим функциям/методам, имеют свои собственные методы и выполняются). Затем он передает созданную функцию (или, лучше сказать, ссылку на функцию) на registerOnload - метод объекта, называемого «API».

Вы должны читать темы об объектах, функциональных типах, областях, анонимных функциях и замыканиях в JS. Я бы посоветовал Mozilla JavaScript guide

Также чувствует себя свободно играть с a simplified example at jsfiddle, который дает практический намек на анонимные функции в JS.