2017-09-14 49 views
1

這是代碼eloquentjavascript:f.apply(NULL,參數)和f(參數)

function transparentWrapping(f) { 
    return function() { 
    return f.apply(null, arguments); 
    }; 
} 

這是我的代碼。我沒有使用apply方法:

function myTransparentWrapping(f) { 
    return function() {//don't use apply 
    return f(arguments); 
    }; 
} 

兩者有什麼區別?

變化所提供的角度,它是否可以說,F之間的差值(參數)和null.f(參數)。

+1

它工作,你想知道區別?只是要清楚你的問題是 – Rowland

+1

[應用程序做了什麼?]的可能重複(https://stackoverflow.com/questions/13317526/what-exactly-does-apply-do) –

回答

1

的申請()方法調用與給定該值的一個函數,和參數作爲一個數組。 請參閱:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

因此,您的第一個函數將返回一個函數,稍後可以使用提供給它的參數執行該函數。 例如:

function add(x, y){ return x + y } 
var functionX = transparentWrapping(add); 
functionX(1, 2) // this will output 3 

和你的第二函數將立即調用與提供給它作爲數組狀物體(參數)的參數傳遞的函數。在前面的例子中,你的f將被稱爲f([1, 2]),這意味着你的x是[1,2],而你的y是未定義的。 (X + Y = [對象參數]未定義)

function add(x, y){ return x + y } 
var functionY = myTransparentWrapping(add); 
functionY(1, 2) // will return [object Arguments]undefined 
0

在自己的實現

function myTransparentWrapping(f) { 
    return function() {//don't use apply 
    return f(arguments); 
    }; 
} 

傳遞arguments作爲參數來f功能。但是arguments是一個類似數組的對象(MDN: Arguments object)。你實際需要的是使用擴展運算符(MDN: Spread syntax)。所以你自己的實現應該看起來像這樣:

function myTransparentWrapping(f) { 
    return function() {//don't use apply 
    return f(...arguments); 
    }; 
}