2012-03-17 12 views
7

Es común y fácil de crear una función como:Es objeto Function necesaria

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

Así que ¿por qué hay objeto Función como:

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

Este último es difícil escribir/leer. Solo puedo pensar en una situación en la que alguien escriba algún código JS en la página web y lo ejecute. Esto también se puede resolver con eval.

¿Por qué objeto de función?

Respuesta

13

El objeto Function se puede usar para generar dinámicamente funciones.

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

Opuesto a:

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

o, usando dos expresiones de función:

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

"Esto también se puede resolver con 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

'function factory (ret) {return function() {return ret;};};' – onemach

+0

@onemach Incorpora otra expresión de función. ¿Cuál es el punto de tu pregunta? –

+0

Puede hacer lo mismo con los cierres. – Gumbo

3

La Función (con capital F) no es una palabra clave, es una clase base para cualquier otra función en JavaScript, dado el hecho de que todo en JavaScript es un objeto, las funciones deben/deben heredar de una clase base que representa la funcionalidad base de todas las otras funciones (métodos/clases).

Puede jugar mucho con la herencia función a través del prototipo de la función:

He aquí un ejemplo para definir un método .run para todas las funciones de JS:

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

prueba:

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

hay una propiedad __proto__ indocumentada que apunta al prototipo de la clase base, puede verificarlo en cada instancia de la función:

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

¡Exactamente! La mayoría de los constructores incorporados (como 'String',' Array', 'Function') no están destinados a ser llamados, sino a ser ampliados. – georg

Cuestiones relacionadas