关于javascript:js中立即调用函数的问题

issue with immediately-invoking-functions in js

1
2
!function add_them(a,b) { return a+b;} (9,4)
console.log(add_them());

题:

它显示:ReferenceError:add_them未定义,有什么问题? 以及如何使它显示正确的结果:13?


问题是立即调用的函数表达式是函数表达式。

在JavaScript中,函数可以是声明或表达式。例如,考虑:

1
2
(function (a, b) { return a + b; }) // This is an expression
 function (a, b) { return a + b; }  // This is a declaration

如何区分函数表达式和函数声明?如果在预期表达式的位置使用该函数,它将自动成为表达式。可以立即调用函数表达式。

另一方面,函数声明也很容易被发现,因为JavaScript中的声明被提升了。因此,可以在程序出现之前调用该函数。例如,考虑:

1
2
3
4
5
console.log(add(2, 3));

function add(a, b) {
    return a + b;
}

现在您的代码问题是您正在立即调用函数表达式。但是因为它是一个表达式而不是声明,所以你不能像普通函数那样使用它。您需要先声明一个函数,然后才能使用它。

改为:

1
2
3
4
5
6
7
add_them(9, 4);

console.log(add_them());

function add_them(a, b) {
    return a + b;
}

如果要修复函数的参数,则可以使用bind,如下所示:

1
2
3
4
5
6
7
var add_9_4 = add_them.bind(null, 9, 4);

console.log(add_9_4());

function add_them(a, b) {
    return a + b;
}

希望有所帮助。


您似乎想要一个简单的函数声明:

1
2
function add_them(a,b) { return a+b;}
console.log(add_them(9,4));

如果要使用立即调用的函数表达式,它可能如下所示:

1
2
3
console.log(function add_them(a,b) { return a+b; } (9,4));
//          \    expression                      / ^^^^^
//                                                 invocation

但是,标识符(add_them)在函数表达式的外部(之后)不可重用。

还要注意,当你的IEFE应该产生一些结果时,!function(){}()的(小)优势超过(function(){})()?被忽略了,因为结果被否定了。


你混淆了浏览器(根据规范,它在技术上是正确的)。

尝试另一种技巧,使其将函数视为表达式:

1
(function add_them(a,b) { return a+b;})(9,4) // 13

或者干脆:

1
console.log((function add_them(a,b) { return a+b;})(9,4)) // logs 13

如果您只是想尝试修复参数,可以.bind将函数设置为值(这是我试图做的事情):

1
2
var add_them = (function(a,b) { return a+b;}).bind(null, 9,4)
console.log(add_them());// logs 13