2013-09-26 3 views
-3

У меня есть некоторый опыт работы с JavaScript, но я хотел бы знать, почему есть левая скобка перед функцией ключевого слова:Левой скобки перед тем функции

requestAnimFrame = (function(callback) { 
    return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || 
    function(callback) { 
     window.setTimeout(callback, 1000/60); 
    }; 
    })(); 

Также вы быть в состоянии объяснить, почему существует 2 обратных вызов функции. Еще одна вещь, почему в последней строке кода есть скобка, в которой нет ничего?

+0

Возможный дубликат [Что заключаются в круглые скобки, связанные с объявлением объекта/объекта/объявления класса?] (Http://stackoverflow.com/questions/440739/what-do-parentheses-surrounding-a-javascript-object-function -class-declaration-m) – showdev

ответ

2

Это самоосуществляющийся анонимные функции:

(function() { 
    // code in here 
})(); 

Используя это заявление, вы можете убедиться в том, что как только вы заявляете, что функция будет выполнена.

+0

Просто из любопытства, зачем вы это делаете? Есть ли смысл обернуть его в функцию? Вы могли бы просто написать строки в функции, как я предполагаю? Мое лучшее предположение было бы для читаемости, а также, может быть, лучшей сборки мусора? – samuraiseoul

+1

Я бы сказал, что, возможно, основным преимуществом этого было бы заставить область на ваш код. В основном, вы завершаете весь свой код внутри функции, что заставляет ее привязываться к области этой функции. (Даже если эта функция инкапсулирует весь ваш код). В принципе, вы «вынуждаете» себя поддерживать чистый глобальный контекст. –

+0

Имеет смысл для меня! – samuraiseoul

1

вы видите (с помощью круглых скобок перед функцией и пустой пары в конце) шаблон называется Immediately-invoked function expression (или IIFE)

(function() { 
    // .... 
})(); 

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

2

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

(function() {})(); 

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

Существует не две функции обратного вызова. Цель этой функции - вернуть другую функцию. Поймите, что в JavaScript функция является объектом. Он может передаваться как любая другая переменная. Это ищет такую ​​переменную и возвращает ее.

В основном это может быть прочитана как:

If `window.requestAnimationFrame` exists, return it. 
Else, if `window.webkitRequestAnimationFrame` exists, return it. 
Else, if ... and so on 
Else, if none of them exist, return this custom function (the one that calls `setTimeout`) 

Какую бы функцию он возвращается затем сохраняется в переменной requestAnimFrame.

Наконец, скобка на последней строке не имеет аналогов. Это закрывающая скобка для внешней функции. Тот, который возвращает внутреннюю функцию.

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