2017-02-12 72 views
0

版本1如何用閉包調用Javascript函數?

function sayHello2(name){ 
 
    var text='Hello'+name; 
 
    var say=function(){ 
 
    console.log(text); 
 
    
 
    }; 
 
return say; 
 
    
 
} 
 

 
var say2=sayHello2("David"); 
 
say2();

2版

function sayHello2(name){ 
 
    var text='Hello'+name; 
 
    var say=function(){ 
 
    console.log(text); 
 
    
 
    }; 
 
return say; 
 
    
 
} 
 

 
sayHello2("David")();

問題:

  1. 爲什麼在版本一中,當您使用var say2調用sayHello2時,您不必添加另一組空括號?
  2. 如果我脫線回說吧,錯誤信息會說出來Hello2不是一個函數,爲什麼?
  3. 爲什麼說say2(); (版本2中的最後一行)?如果我刪除該行,則沒有任何更改,「HelloDavid」仍將被記錄。
+0

唯一的區別是您將第一步存儲到變量中而不是調用它。第二個就是不使用變量。 – epascarello

回答

4
  1. 在代碼兩種樣品,函數調用製成。第一個和第二個之間的區別在於,在第一個示例中,在進行第二個函數調用之前,第一個函數調用的結果存儲在say2中。第二個示例立即使用來自sayHello2()的返回值來調用返回的函數。

  2. 如果沒有return聲明,則sayHello2()返回undefined

  3. 這個問題的主張,即刪除say2();行不會改變行爲,是不正確的。如果您不撥打say2(),則不會記錄任何內容。

sayHello2()

function sayHello2(name){ 
    // Initialize the text that will be logged 
    var text='Hello'+name; 

    // Create the function that will log the message 
    var say=function(){ 
    console.log(text); 
    }; 

    // Return the logging function 
    return say; 
} 

sayHello2()函數返回到調用console.log()那個小函數的引用。由於函數是JavaScript中的對象值,因此對函數的引用以及任何其他類型的值都可以工作,並且可以存儲在變量中或在表達式中使用。

注意所創建的日誌功能時,這是一個var initailization完成:

var say=function(){ 
    console.log(text); 
    }; 

這是本質上發生了變化say2同樣的事情:

var say2=sayHello2("David"); 

除了這裏,在=符號的右側有一個函數調用而不是函數實例化。

聲明

say2(); 

因此呼籲在於用從調用返回到sayHello2()小記錄功能。

第二代碼示例做同樣的事:

sayHello2("David")(); 

不同之處在於有返回的函數參照的沒有中間存儲。相反,引用立即用於進行第二次函數調用。

在第一個版本,計數由該函數調用:

var say2 = sayHello2("David"); // First function call 
say2(); // Second function call 

在第二個版本:

// First   // Second 
sayHello2("David")(); 

在JavaScript中,形式的

something() 

總是表達意思是「將something解釋爲對函數的引用,並將其稱爲(不傳遞參數TER值)。」如果something不是對函數的引用,則會發生異常。因此在版本2中,我們的somethingsayHello2("David")。因爲它後面有第二組空括號,這意味着我們正在告訴JavaScript進行另一個函數調用。

+0

但say2()的目的是什麼? – user132522

+0

我仍然不清楚你說了什麼「第二個示例立即使用sayHello2()的返回值來調用返回的函數。」。什麼返回函數?什麼是返回值? – user132522

+0

@ user132522'sayHello2()'返回對**函數**的引用。該引用存儲在變量'say2'中,所以'say2()'對該函數進行**調用**。 – Pointy