2015-05-28 21 views
10

Sto iniziando a cercare Javascript e JQuery (da qui la mia scelta dell'esempio qui sotto). E ho scoperto che potrei definire una funzione e chiamarla (come previsto), ma che potrebbe anche solo .. fare qualcosa di diverso .. E questo è il problema:javascript, funzioni vs variabili

function $() { 
    console.log('hi'); 
} 

$() 
$ 

non ho ricevuto un errore con la chiamata alla funzione o semplicemente affermando '$' senza chiamare la funzione. Cosa sta facendo in realtà l'ultimo? E perché funziona se in realtà non sta chiamando la funzione?

risposta

3

Un oggetto JavaScript è un mapping tra chiavi e valori. Le chiavi sono stringhe e valori possono essere qualsiasi cosa. Ciò rende gli oggetti naturali in forma per le hashmap.

Le funzioni sono oggetti regolari con la capacità aggiuntiva di essere richiamabile.

DAhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#.22Normal.22_objects.2C_and_functions

Ciò significa che si può fare cose come:

function test(){ 
    console.log(1); 
} 

var a = test; 

a(); 

o

var test2 = function(){ 
    console.log(2); 
} 

o autochiamata

//sorry for the indentation. 
(
    function(){ 
    console.log(3); 
    } 
)() 

o crearne strutture

var testHash = { 
    a : 1, 
    b : function(){ 
     console.log(4); 
    } 
} 

testHash.b(); 

testHash['b'](); 

e creare la funzione difficile da chiamare:

//in a browser environment 
window['test3'] = function(){ 
    console.log(5); 
} 

window['test space'] = function(){ 
    console.log(6); 
} 

test3() //no error 
test space() //error :D 

EDIT: L'utente vuole sapere di più su funzioni di Monitoraggio:

Perché questo lavoro?

(
    function(){ 
    console.log(3); 
    } 
)() 

E 'facile da seguire in 2 fasi:

La parentesi, se sappiamo che una funzione è come le altre variabili, e sappiamo che la parentesi è solo per gruppi composti o funzioni di chiamata.

var test_1 = 'string example'; 
var length = (test_1).length; // the same that test_1.length 

senso in:

var test_1 = 'string'; 
var test_2 = ' example'; 
var length = (test_1 + test_2).length; // the same that test_1.length 

invece di:

var test_1 = 'string'; 
var test_2 = ' example'; 
var aux = test_1 + test_2; 
var length = aux.length; // the same that test_1.length 

Ora, questo ha senso per te ?:

var length = ('string example').length; // instead the first example 

Secondo passo, possiamo cambia la stringa per la funzione .. e chiamala

(function(){ ... })() 

perché è interessante? Bene, ora appare il concetto di chiusura.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

Le chiusure sono uno strumento molto importante in javascript.

+0

Grazie, questa è davvero una grande risposta. Puoi spiegarmi come funziona la funzione autocall? –

+0

Ho fatto un aggiornamento. –

10

Non fa nulla. È solo una variabile che ha una funzione.

Non è diverso dal seguente codice altrettanto inutile:

42; 
+3

42, eh? Vedo quello che hai fatto là. –

+0

beh in tal caso, qual è la differenza tra definire una funzione come funzione (funzione x() {...}) e aggiungere una funzione a una variabile attraverso un callback (var x = function() {...}). Sembra che tu finisca con gli stessi risultati ... –

+0

@ZachSmith: Quasi. https://kangax.gthub.io/nfe/ – SLaks

1

il nome "$" è solo il titolare della funzione, facendo la linea "$" è solo per elencare il contenuto della codice (nello strumento di sviluppo di Google Chrome).

$() per chiamare la funzione.

$ è quello di dichiarare ciò che è in possesso.