2
<script>
!function add_them(a,b) { return a+b;} (9,4)
console.log(add_them());
</script>

问题:

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

4

3 回答 3

1

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

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

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

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

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

另请注意,当您的 IEFE 应该产生一些结果时,!function(){}() 相对于 (function () {})() 的(小)优势?被忽略,因为结果被否定。

于 2013-06-21T02:04:28.073 回答
1

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

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

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

如何区分函数表达式和函数声明?如果函数用在需要表达式的地方,它会自动变成表达式。可以立即调用函数表达式。

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

console.log(add(2, 3));

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

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

改为这样做:

add_them(9, 4);

console.log(add_them());

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

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

var add_9_4 = add_them.bind(null, 9, 4);

console.log(add_9_4());

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

希望有帮助。

于 2013-06-21T02:12:50.780 回答
1

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

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

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

或者简单地说:

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

如果您只是想固定参数,则可以.bind将函数设置为值(在我看来,您正在尝试这样做):

var add_them = (function(a,b) { return a+b;}).bind(null, 9,4)
console.log(add_them());// logs 13
于 2013-06-21T02:02:40.297 回答