<script>
!function add_them(a,b) { return a+b;} (9,4)
console.log(add_them());
</script>
问题:
它显示:ReferenceError:add_them 未定义,有什么问题?以及如何让它显示正确的结果:13?
<script>
!function add_them(a,b) { return a+b;} (9,4)
console.log(add_them());
</script>
问题:
它显示:ReferenceError:add_them 未定义,有什么问题?以及如何让它显示正确的结果:13?
您似乎想要一个简单的函数声明:
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 () {})() 的(小)优势?被忽略,因为结果被否定。
问题是立即调用的函数表达式是函数表达式。
在 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;
}
希望有帮助。
您混淆了浏览器(好吧,根据规范,它在技术上是正确的)。
尝试另一种技巧,使其将函数视为表达式:
(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