2012-03-17 21 views
7

Jest powszechne i łatwe tworzenie funkcji, takich jak:Czy obiekt Funkcja konieczne

var f = function(){ 
    alert("something"); 
}; 

Więc dlaczego jest przedmiotem Funkcja jak:

var f = new Function("alert('something');"); 

To ostatnie jest trudne do zapisu/odczytu. Mogę wymyślić tylko jedną sytuację, w której ktoś wpisuje jakiś kod JS do strony i uruchamia ją. Można to również rozwiązać za pomocą eval.

Dlaczego obiekt funkcji?

Odpowiedz

13

Obiekt Function może być używany do dynamicznego generowania funkcji.

var some_fixed_value = 1; 
var f = new Function("return " + some_fixed_value); 

przeciwny:

var some_fixed_value = 1; 
var f = function() { 
    return some_fixed_value; 
}; 
// Break the function logic: 
some_fixed_value = 'not_fixed_any_more!'; 

lub za pomocą dwóch wyrażeń funkcyjnych:

var f = (function(copy_of_fixed_value) { 
    return function() { 
     return copy_of_fixed_value; 
    }; 
})(some_fixed_value); 

"To może być rozwiązany z eval":

var func_func = new Function('x', 'return x'); //function anonymous(x){return x} 
var evil_func = eval('function(x){return x}'); //SyntaxError: function statement 
               // requires a name 
var eval_func = eval('(function(x){return x})');//function(x){return x} 
+0

'funkcja fabryka (ret) {funkcja powrotu() {return ret;};};' – onemach

+0

@onemach To zawiera inne wyrażenie funkcji. Jaki jest sens twojego pytania? –

+0

Możesz zrobić to samo z zamknięciami. – Gumbo

3

Funkcja (z kapitałem F) nie jest słowem kluczowym, jest klasą podstawową dla wszystkich innych funkcji w JavaScript, biorąc pod uwagę fakt, że wszystko, co w JavaScript jest obiektem, funkcje powinny/muszą dziedziczyć po klasie bazowej reprezentującej podstawową funkcjonalność wszystkich innych funkcji (metody/classes).

Można grać dużo z funkcji dziedziczenia poprzez prototyp funkcja jest:

oto przykład zdefiniować metodę .run dla wszystkich funkcji w JS:

Function.prototype.run = function (delay) { 
    setTimeout(this, delay); 
}; 

Test:

function test(){console.log("test")}; 
test.run(2000); 

istnieje nieudokumentowana właściwość __proto__, która wskazuje prototyp klasy bazowej, można to sprawdzić w każdym wystąpieniu funkcji:

test.__proto__ == Function.prototype; // true 
+0

Dokładnie! Większość wbudowanych konstruktorów (takich jak 'String',' Array', 'Function') nie jest przeznaczona do wywoływania, ale raczej do rozszerzenia. – georg

Powiązane problemy