JavaScript函数 - 为什么这样有效?

时间:2014-08-08 23:07:42

标签: javascript

我已经做了多年的服务器端编码,即Python,shell以及最近的Java。虽然我已经完成了一些客户端JavaScript,但我从来没有深入挖掘过。

直到我找到node.js和它周围的堆栈。现在我很高兴。我正在拼命地理解异步编程和回调函数。我正在取得进步,但后来我找到了让我回到完全混乱和绝望之地的东西。

var add = new Function('num1', 'num2', 'return num1 + num2');
console.log(add(1, 2));

Outputs: 3

任何人都可以向我解释我是5岁,为什么以及如何运作?我看到的方式是,一个名为“add”的函数需要三个参数。我将数字传递给前两个,但最后一个参数是实际代码。是的,我有点理解JavaScript函数实际上是包含代码串的对象(这会伤害我的大脑)。但是,是什么导致第三个参数“触发”。 JS如何知道执行第三个参数,就好像它是函数本身的一行,而不是参数。

对......这个愚蠢的问题感到抱歉。不,这不是家庭作业,我已经老了。它甚至不是一个真正的工作项目,我只是喜欢挖掘这样的东西,而这一个导致虚拟的眼泪。

谢谢, TR

4 个答案:

答案 0 :(得分:1)

“Function”是Javascript中的构造函数。这意味着当您使用“new”关键字时,您将三个参数传递给“Function”构造函数。 “Function”构造函数返回一个函数,但不要将返回的函数与您用作构造函数的Function()调用混淆。

“Function”构造函数接受一个或多个参数。最后一个参数是函数体,其余参数是函数参数。所以 - 实际上 - 你的代码就像:

var add = function(num1, num2) {return num1 + num2};

希望有所帮助。

答案 1 :(得分:0)

当您使用Function构造函数时,它运行在HTML或JS文件中处理Javascript时使用的Javascript编译器/解释器的相同部分。它读取最后一个参数并将其转换为函数体,就像Javascript编译器在加载文件时所做的那样。

因此,如果您加载了包含以下内容的文件,它将运行相同的Javascript编译器代码:

function (num1, num2) { 
    return num1 + num2;
}

答案 2 :(得分:0)

定义函数的常用方法是使用

function add(x, y){
    return x + y;
}

var add = function(x, y){
    return x + y;
}

new Function更类似于eval,除了它构建一个函数而不是立即运行代码。你可能不应该使用它。它不仅绕过你的linter而且弄乱了优化器,但与常规函数不同,它不会从外部作用域继承变量。

//this should return 3
function foo(x){
    function bar(){ return x; }
    return bar();
}

// This bersion of bar is going to try to read a global variable x instead.
function foo(x){
    var bar = new Function("return x;");
    return bar();
}

答案 3 :(得分:0)

 new Function('num1', 'num2', 'return num1 + num2');

第一个num1定义参数[0],第二个num2定义参数[1],然后函数体是第三个参数。

另请注意,使用Function构造函数创建函数时没有特殊范围,它们是在全局范围[0]

中创建的

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function