在js中立即调用函数的问题

时间:2013-06-21 02:00:35

标签: javascript

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

问题:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)不能在function expression之外(之后)重复使用。

另请注意,当您的IEFE应该产生一些结果时,忽略(little) advantage of !function(){}() over (function () {})()?,因为结果被否定了。

答案 2 :(得分: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;
}

希望有所帮助。