2017-07-18 178 views
0

我剛開始學習JavaScript,遇到一個我不明白的任務。任何人都可以解釋我爲什麼我們在這個例子中返回函數名「return f」,以及我們使用「f.toString」是什麼?JS,返回函數名稱

function sum(a) { 

    var currentSum = a; 

    function f(b) { 
    currentSum += b; 
    return f; 
    } 

    f.toString = function() { 
    return currentSum; 
    }; 

    return f; 
} 

alert(sum(1)(2)); // 3 
alert(sum(5)(-1)(2)); // 6 
alert(sum(6)(-1)(-2)(-3)); // 0 
alert(sum(0)(1)(2)(3)(4)(5)); // 15 
+5

你沒有返回「名稱」,你正在返回*函數*。 – deceze

+0

正如@deceze所說,你返回函數f,該函數在它將'b'添加到'currentSum'之後返回'f'。 – Sventies

+0

至於第二個問題''f.toString'被'alert'調用(當它收到它作爲一個參數) – UnholySheep

回答

1

讓我們開始用一個簡化版本:

function sum(currentSum) {  
    return function f(b) { 
    currentSum += b; 
    return f; 
    } 
} 

它willwork很像你的,你可以這樣做:

sum(1)(2)(3);//f 
sum(1)(2);//f 

然而,他們總是返回的功能,所以無法訪問currentSum。它的總和範圍並且因爲它從未返回或通過,所以不可能得到它。因此,我們可能需要另一個函數可以調用來獲得當前的總和:

function sum(currentSum) { 
    function f(b) { 
    currentSum += b; 
    return f; 
    } 

    f.getSum = function() { 
    return currentSum; 
    }; 

    return f; 
} 

所以現在˚F有一個屬性(函數對象了),這是一個名爲getSum功能,讓我們的變量

sum(1)(2)(3)//f 
sum(1)(2)(3).getSum()//6 <= wohhooo 

但是我們爲什麼稱它爲toString

將變量添加到字符串時,將其轉換爲字符串,例如

1+"one"//"1one" 

同樣適用於對象/功能,但在這種情況下,JS解析器試圖首先調用其的toString方法,所以:

sum(1)(2)+"three" 

等於

sum(1)(2).toString()+"three" 

將非字符串傳遞給alert時會發生相同的轉換。

0

您正在返回對象。所以你可以再次調用函數,在第二次調用中,你將有一個currentSum allready。 (3)該函數將保存數字3,當你再次調用sum(3)(4)時,它會將currentSum加4。

那麼警報將調用toString方法,它將打印總和

0

看看第一個例子

alert(sum(1)(2)); // 3 
sum(1) // will return f. sum must return a function in order for the syntax to work 

後,將返回f,就會變成:

alert(f(2)); 
0

這是理解JavaScript的類型系統的任務。任務是使用currying添加數字的功能。當你在任務中寫入時,這個想法就是讓函數在調用像這樣sum(1)(2)(3)時添加數字。

我們做什麼函數sum(看你的代碼):

1.

var currentSum = a; 

在這裏,您在功能sum範圍聲明總和變量。

  1. function f(b){ currentSum + = b; return f; }

然後你聲明將執行求和的函數。它返回本身做這樣的事情的可能性:f(1)(2)(3)

3.

f.toString = function() { 
    return currentSum; 
    }; 

之後聲明使得f,轉換成字符串返回總和值

  • 比你返回f開始添加。

  • 比約f.toString - 它被調用,當f傳遞alert作爲參數。這是JavaScript的自動澆注

    0

    隨着功能sum要傳遞的第一個參數a和返回功能f其總和currentSum與傳遞給fb)的參數,並再次回到f,你可以做你想要在多次結束它將調用alert函數,它需要它的第一個參數是字符串。爲此,您已經重寫了功能ftoString的方法,在這種情況下將返回currentSum

    每個對象都有一個toString()方法,當要將對象表示爲文本值時,該方法會自動調用。