2013-03-08 8 views
14

Per quanto riguarda JS, qual è la differenza tra i due? So che i metodi sono associati agli oggetti, ma sono confuso qual è lo scopo delle funzioni? In cosa differisce la sintassi di ognuno di essi?Metodo vs Funzioni e altre domande

Inoltre, qual è la differenza tra questi 2 syntax'es:

var myFirstFunc = function(param) { 
    //Do something 
}; 

e

function myFirstFunc(param) { 
    //Do something 
}; 

Inoltre, ho visto da qualche parte che abbiamo bisogno di fare qualcosa di simile prima utilizzando una funzione:

obj.myFirstFunc = myFirstFunc; 
obj.myFirstFunc("param"); 

Perché è necessaria la prima riga e cosa fa?

Scusate se queste sono domande di base, ma sto iniziando con JS e sono confuso.

EDIT: Per l'ultimo pezzo di codice, questo è ciò di cui sto parlando:

// here we define our method using "this", before we even introduce bob 
var setAge = function (newAge) { 
    this.age = newAge; 
}; 
// now we make bob 
var bob = new Object(); 
bob.age = 30; 
// and down here we just use the method we already made 
bob.setAge = setAge; 
+1

possibile duplicato di [JavaScript: var functionName = function() {} vs function functionName() {}] (http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function- functionname) –

+1

Cercare "Function declaration vs function expression". – elclanrs

+0

Dove hai visto quell'ultima parte? Non c'è motivo di farlo, a meno che 'obj.myFirstFunc' non sia definito e debba essere un riferimento a' myFirstFunc'. –

risposta

-1

Il primo è scritto in letterali oggetto JS. Puoi creare i tuoi oggetti in questo modo, è più facile da leggere e puoi anche seguire gli schemi di progettazione. L'altro è anche una funzione e puoi anche trattarlo come un oggetto a seconda del tuo codice JS.

obj.myFirstFunc = myFirstFunc; 
obj.myFirstFunc("param"); 

Queste due linee crea un'istanza questo myFirstFunc (param) mentre il primo non necessita istanziazione.

Anche questa domanda è stata posta prima. Si prega di consultare What is the difference between a function expression vs declaration in JavaScript?

+0

-1, è un'espressione di funzione, che è molto diversa da un oggetto letterale. – RobG

+0

Perché downvote? Non ho detto nulla di sbagliato qui. Il primo è scritto in oggetti letterali. – u54r

+1

Oltre alla confusione del letterale dell'oggetto con un'espressione di funzione, il codice che hai citato è più correttamente descritto come un'assegnazione seguita da una chiamata. – RobG

-1
var myFirstFunc = function(param) { 
    //Do something 
}; 

e

function myFirstFunc(param) { 
    //Do something 
}; 

sono (quasi) identici. Il secondo è (di solito) solo una scorciatoia. Tuttavia, come mostra questo jsfiddle (http://jsfiddle.net/cu2Sy/), function myFirstFunc farà sì che la funzione venga definita non appena viene immesso l'ambito di inclusione, mentre myFirstFunc = function lo creerà solo una volta che l'esecuzione raggiunge quella linea.

Per quanto riguarda i metodi, hanno un argomento this, che è l'oggetto corrente, in modo da:

var obj = {}; 
obj.func = function() { 
    // here, "this" is obj 
    this.test = 2; 
} 
console.log(obj.test); // undefined 
obj.func(); 
console.log(obj.test); // 2 

La sintassi esatta hai mostrato è perché si può anche fare questo:

function abc() { 
    this.test = 2; 
} 
var obj = {}; 
obj.func = abc; 
obj.func(); // sets obj.test to 2 

ma non dovresti senza una buona ragione.

+0

downvoted? Cosa c'è di sbagliato in questa risposta? – Dave

+1

Non è il mio downvote, ma probabilmente perché il primo è un * FunctionExpression *, il secondo è un * FunctionDeclaration *, la differenza è quando vengono creati. Il primo è quando viene eseguita la riga di codice, la seconda viene creata prima dell'esecuzione di qualsiasi codice. – RobG

+0

Quale sarebbe una "buona ragione" per usare l'ultimo bit di codice? –

1

La prima linea, sta creando un oggetto che fa riferimento a una funzione.Si potrebbe fare riferimento in questo modo:

myFirstFunc(param); 

Ma si può passare ad un'altra funzione dal momento che restituirà la funzione in questo modo:

function mySecondFunction(func_param){} 
mySecondFunction(myFirstFunc); 

La seconda riga crea solo una funzione chiamata myFirstFunc che sarebbe riferimento in questo modo:

myFirstFunc(param); 

E non sono complete a seconda di dove è dichiarata, se viene dichiarata all'esterno di qualsiasi altra funzione che appartiene al globale scopo. Tuttavia è possibile dichiarare una funzione all'interno di un'altra funzione. Lo scopo di tale funzione è quindi limitato alla funzione dichiarata all'interno di.

function functionOne(){ 
    function functionTwo(){}; //only accessed via the functionOne scope! 
} 

Gli esempi finali creano istanze di funzioni a cui viene fatto riferimento tramite un parametro oggetto. Quindi:

function myFirstFunc(param){}; 

obj.myFirst = myFirstFunc(); //not right! 
obj.myFirst = new myFirstFunc(); //right! 

obj.myFirst('something here'); //now calling the function 

Si dice che si abbia un oggetto che fa riferimento a un'istanza di una funzione. Il tasto qui è che se la funzione cambia il riferimento , non verrà modificato in obj.myFirst.

Mentre @ Kevin è fondamentalmente destra v'è solo le funzioni in JS è possibile creare funzioni che sono molto più simili metodi poi funzioni, prendere questo ad esempio:

function player(){ 

    this.stats = { 
     health: 0, 
     mana: 0, 

     get : function(){ 
      return this; 
     }, 

     set : function(stats){ 
      this.health = stats.health; 
      this.mana = stats.mana; 
     } 
}  

Si potrebbe quindi chiamare player.stats.get() e sarebbe tornare a voi il valore di heath e mana. Quindi considererei get e set in questo caso come metodi dell'oggetto player.stats.

+1

in realtà aiuta. Vedrò di più su questo e chiedere ulteriormente se ho dubbi –

+0

Si commenta che non può essere passato come un parametro non è vero. – Nicholas

18

Per rispondere alla domanda sul titolo su quale sia la differenza tra una "funzione" e un "metodo".

È semantica e ha a che fare con ciò che stai cercando di esprimere.

In javascript ogni funzione è un oggetto. Un oggetto è un insieme di chiavi: coppie di valori. Se un valore è un primitivo (intero, stringa, booleano) o un altro oggetto, il valore è considerato una proprietà. Se un valore è una funzione, viene chiamato "metodo".

Nell'ambito di un oggetto, una funzione viene definita come un metodo di quell'oggetto. Viene richiamato dallo spazio dei nomi dell'oggetto "MyObj.theMethod()". Poiché abbiamo detto che una funzione è un oggetto, una funzione all'interno di una funzione è considerata un metodo di quella funzione. Puoi dire che userò il metodo di salvataggio del mio oggetto. Oppure potresti dire "il metodo di salvataggio accetta una funzione come parametro" ". Ma generalmente non diresti che una funzione accetta un metodo come parametro.

BTW il libro Javascript Patterns di Stoyan Stefanov copre le vostre domande in dettaglio, e lo consiglio vivamente se volete veramente capire la lingua. Ecco una citazione dal libro su questo argomento.

Quindi potrebbe succedere che una funzione A, essendo un oggetto, abbia proprietà e metodi, uno dei quali è di cui un'altra funzione B.Poi B può accettare una funzione C come argomento e, quando eseguito, può tornare un'altra funzione D.

1

Non c'è differenza nel reale, ma entrambe le cose sono differenza:

Metodo: Il metodo è una funzione quando l'oggetto è associato ad esso.

var obj = { 
name : "John snow", 
work : function someFun(paramA, paramB) { 
    // some code.. 
} 

Funzione: Quando nessun oggetto è associato ad esso, viene alla funzione.

function fun(param1, param2){ 
// some code... 
} 
0

Una funzione esegue un elenco di istruzioni esempio:

function add() { 
    var a = 2; 
    var b = 3; 
    var c = a + b; 
    return c; 
} 

1) Un metodo è una funzione che viene applicata a una lista oggetto:

var message = "Hello world!"; 
var x = message.toUpperCase(); // .toUpperCase() is a built in function 

2) Creazione di un metodo usando un costruttore di oggetti. Una volta che il metodo appartiene all'oggetto, puoi applicarlo a quell'oggetto. esempio:

function Person(first, last, age, eyecolor) { 
    this.firstName = first; 
    this.lastName = last; 
    this.age = age; 
    this.eyeColor = eyecolor; 
    this.name = function() {return this.firstName + " " + this.lastName;}; 
} 

document.getElementById("demo").innerHTML = person.fullName(); // using the 
method 

Definizione di un metodo: un metodo è una proprietà di un oggetto che è una funzione. I metodi sono definiti nel modo in cui sono definite le normali funzioni, ad eccezione del fatto che devono essere assegnati come proprietà di un oggetto.