JavaScript函数-为什么这样做?

JavaScript函数-为什么这样做?,javascript,Javascript,我做服务器端编码已经有几年了,即用Python、shell和最近的Java。虽然我做过一些客户端JavaScript,但我从未深入研究过 直到我找到node.js和它周围的堆栈。现在我入迷了。我正在拼命地理解异步编程和回调函数。我正在进步,但后来我发现了一些东西,把我扔回了完全混乱和绝望的土地 var add = new Function('num1', 'num2', 'return num1 + num2'); console.log(add(1, 2)); Outputs: 3 有没有

我做服务器端编码已经有几年了,即用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

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

因此,它运行的Javascript编译器代码与加载包含以下内容的文件时运行的Javascript编译器代码相同:

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

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

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

新函数
更类似于
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();
}
“函数”是Javascript中的构造函数。这意味着当您使用“new”关键字时,您将向“Function”构造函数传递三个参数。“Function”构造函数返回一个函数,但不要将返回的函数与用作构造函数的Function()调用混淆

“函数”构造函数接受1个或多个参数。最后一个参数是函数体,其余参数是函数参数。因此,实际上,您的代码执行以下操作:

var add = function(num1, num2) {return num1 + num2};
希望有帮助

 new Function('num1', 'num2', 'return num1 + num2');
第一个
num1
定义参数[0],第二个
num2
定义参数[1],然后函数体是第三个参数

还请注意,使用函数构造函数创建函数时没有特殊作用域,它们是在全局作用域[0]中创建的


您在console.log(添加(1,2))中遗漏了一个括号;这是创建并返回新函数的函数构造函数。这不是创建函数的常用方法。您可以想象它在内部执行类似于
returneval('function('+arguments[0]+','+arguments[1]+'){'+arguments[2]}')的操作。它相当于执行
varadd=function(num1,num2){returnnum1+num2;}。如果你想了解函数,看看JS函数可以有动态数量的参数,你可以检测到传递给函数的最后一个参数。你可以找到更多信息和@FelixKling为什么这样做?我没有投你反对票,但可能投反对票的人认为位置3永远是函数体,什么时候定位是可变的?我投你的票是因为这一点很清楚。
 new Function('num1', 'num2', 'return num1 + num2');