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; } |
如果要修复函数的参数,则可以使用
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 |
但是,标识符(
还要注意,当你的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 |
如果您只是想尝试修复参数,可以
1 2 | var add_them = (function(a,b) { return a+b;}).bind(null, 9,4) console.log(add_them());// logs 13 |