2015-01-02 14 views
5

creo un oggetto JavaScript come sottostante Codice:JavaScript: chiamare una funzione con tutto la funzione out di ritorno parentesi come stringa

var obj={ 
    a : 10, 
    b : 20, 
    add : function(){ 
    return this.a + this.b; 
    }, 
}; 

ho eseguito la funzione con questo codice obj.add e restituire l'intera funzione come stringa come questo : -

function(){ 
    return this.a + this.b; 

ma poi provo per chiamare la funzione di nuovo compresa la parentesi come obj.add() e restituire il valore di 30. Qui non ho potuto capire perché ottengo così diverso dal mettere su di chiamare la funzione con obj.add e obj.add()? Qual è la principale differenza tra chiamare una funzione di oggetti con parentesi e senza parentesi Può qualche aiuto del corpo ??

+2

Non si può * * chiamata di una funzione senza parentesi. L'aggiunta di '()' è come si chiama una funzione. Senza '()', stai solo ottenendo la funzione stessa. In JavaScript, le funzioni sono solo variabili, come stringhe o intarsi o altro. –

+0

'add' è [un oggetto' Function'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function). Quando lo usi senza parentesi, sei * probabilmente * convertendolo in una 'stringa' attraverso la [tipo coercizione] del chiamante (http://stackoverflow.com/questions/19915688/what-exactly-is-type- coercion-in-javascript) – blgt

+0

ma come vedo negli strumenti dev i chiamando obj.add non ottengo l'oggetto, ma la stringa litterale. non lo capisco – ambes

risposta

5

Senza parentesi, si sta recuperando un riferimento alla funzione, non si sta chiamando (in esecuzione) la funzione

Con parentesi, si sta eseguendo la funzione.

function a() { 
 
    return 2; 
 
} 
 

 
var b = a(); // called a, b is now 2; 
 
var c = a; // c is referencing the same function as a 
 
console.log(c); // console will display the text of the function in some browsers 
 
var d = c(); // But it is indeed a function, you can call c(), d is now 2;

+0

'c è la stessa cosa di a now' non vero, è passato per valore, non per riferimento. Cambiare 'c' non cambierà' a', né viceversa. – Shomz

+0

@Shomz OK, 'c' fa ora riferimento allo stesso oggetto funzione di' a'. –

3

Non hai eseguire la funzione con obj.add, si guardava solo nel l'oggetto e l'ambiente si è in successo per rendere la funzione come una stringa. Lo si esegue aggiungendo le parentesi.

2

Senza la parentesi non si sta chiamando nulla, né si restituisce nulla, è solo un riferimento!

Sto indovinando che hai fatto qualcosa di simile

var result = ambes.add; 

console.log(result); 

e che non chiama la funzione, si registra il effettivo contenuto della add immobile, che è la funzione, e la registrazione una funzione registrerà il contenuto della stringa della funzione, non quello che restituire se l'avessi chiamato.

+0

Tecnicamente si sta restituendo l'oggetto funzione stesso. In seguito è possibile chiamare 'result()' per eseguire la funzione e ricevere qualsiasi valore restituito. – musicfuel

+0

anche il tuo codice risulta uguale, l'intera funzione come stringa – ambes

+0

@musicfuel - non è quello che ho scritto ".. il contenuto della proprietà add, che ** è ** la funzione"? – adeneo

1

È piuttosto semplice: functionName restituisce semplicemente il corpo della funzione, mentre functionName() esegue la funzione e restituisce il valore restituito (o undefined, se non c'è un ritorno esplicito). Lo stesso principio funziona quando una funzione è una proprietà dell'oggetto, come nel caso di obj.add.

0

La chiamata di una funzione richiede() perché sono l'operatore di chiamata di funzione. Per eseguire una funzione dovrai sempre includere parentesi.

Quando si chiama ambes.add si restituisce l'oggetto funzione stesso. Se lo fai all'interno di console.log() o concatenalo su una stringa, JavaScript restituirà la definizione della funzione come una stringa completa che spiega il primo output che ricevi.

0

È necessario utilizzare() per chiamare una funzione in JavaScript.

Se non si utilizza la parentesi, si fa semplicemente riferimento alla funzione, che può essere utile nel caso in cui si desideri passare una funzione a un altro blocco di codice per l'esecuzione differita.

Nella tua situazione, perché si desidera chiamare aggiungere subito, si dovrebbe essere sicuri di utilizzare()

obj.add(); 
Problemi correlati