<script>
!function add_them(a,b) { return a+b;} (9,4)
console.log(add_them());
</script>
问题:
它显示:ReferenceError:add_them未定义,有什么问题?以及如何使它显示正确的结果:13?
答案 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;
}
希望有所帮助。