2013-04-03 11 views
11

Próbuję zmienić przeznaczenie kodu JavaScript, który znalazłem połączony w odpowiedzi na SO. Ale najpierw chciałbym lepiej zrozumieć jego składnię. Jego zarys jest:Wartości w nawiasach po funkcji javascript

(function (root, ns, factory) { 
    // some code 
} (window, 'detectZoom', function() { 
    // some more code 
})); 

Akceptowane odpowiedź w this post w odniesieniu do pełnego kodu.

Rozumiem, jaki jest efekt końcowy, ale nie do końca wiem, w jaki sposób blok wewnętrzny (...) jest związany z pierwszym, lub co lista oddzielająca przecinkami wewnątrz niego mówi kompilatorowi.

Czy ktoś może wyjaśnić? Dzięki.

Odpowiedz

12

Istnieje anonimowa funkcja z trzema parametrami (root, ns, factory), która jest natychmiast wywoływana.

  • root przyjmuje wartość "okna".
  • ns przyjmuje wartość 'detectZoom'
  • factory przyjmuje wartość funkcji zwrotnej (również anonimowo)

Wyjaśnienie:

(function (root, ns, factory) { 
    // the body of the anonymous function 
} (window, 'detectZoom', function() { 
    // the body of the 'factory' callback 
})); 

Aby przełamać go od siebie, jak dostać się do tego kodu w czterech krokach:

1. 
// Anonymous function. 
(function (root, ns, factory) {/* body */}); 

2. 
// Anonynmous function, immediately invoked 
(function (root, ns, factory) {/* body */})(); // parentheses mean it's invoked 

3. 
// Callback as a separate argument 
var cbk = function() {}; 
(function (root, ns, factory) {/* body */})(window, 'detectZoom', cbk); 

4. 
// Callback as an anonymous function 
(function (root, ns, factory) {/* body */})(window, 'detectZoom', function() {}); 

Możesz przepisać swój kod, aby był bardziej szczegółowy:

var outer = function (root, ns, factory) { 
    // the body 
}; 

var callback = function() { 
    // the body 
}; 

outer(window, 'detectZoom', callback); 
1

Tworzy anonimową funkcję (nazwy), który przyjmuje trzy parametry:

function (root, ns, factory) { 
    // some code 
} 

Wtedy natychmiast nazywa tę funkcję przechodzącej trzy argumenty, trzeci jest inny anonimowy funkcja:

(window, 'detectZoom', function() { 
    // some more code 
}) 

Dwa bloki muszą być owinięte wewnątrz pary (); Powodem jest wyjaśnione tutaj:
Explain JavaScript's encapsulated anonymous function syntax

9

Co trzeba to natychmiast, wywoływana funkcja wyrażenie (IIFE). Jeśli rozebrać wszystkie argumenty jesteś po prostu w lewo z tego:

(function() { 
    // some code 
}()); 

Funkcja spodziewa trzy argumenty:

(function (root, ns, factory) { 
    // some code 
}()); 

I przekazać go trzy argumenty:

(function (root, ns, factory) { 
    // some code 
} (window, 'detectZoom', function() { 
    // some more code 
})); 

One tych argumentów, factory, jest funkcją.

Powiązane problemy