据我所知,围绕函数声明的分组运算符强制将函数作为表达式求值。这是允许执行括号操作符()
工作的原因。但是,此方法会删除函数名称,使其无法在外部访问。我想知道如何存储IIFE函数名称与声明它们的作用域中可用的函数声明名称相比较。
(function hidden(){
console.log("function executed");
})()
答案 0 :(得分:1)
Angus Croll有一篇很好的文章,关于函数声明和javascript中函数表达式之间的区别(https://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/)
基本上你要做的是将函数hidden()视为函数表达式中的函数声明。正如Croll在文章中所述,在函数表达式中,“函数名称(如果有的话)在其范围之外是不可见的(与函数声明对比)。”
如果你将匿名函数重写为赋值,那么我认为这一点更清晰:
var a = function hidden() {
console.log('inside hidden');
}
现在这会出错:
var a = function hidden() {
console.log('inside hidden');
}
hidden();
因为函数的名称在其自己的上下文之外不可用。
但是这样可以正常工作:
var a = function hidden() {
console.log('inside hidden');
}
a();
因为变量可以像你期望的那样在它自己的上下文之外被引用(否则它不会在hidden()函数体内的任何地方被访问)。
如果我们再看一下匿名版本,您可以看到它失败的原因:
(function hidden() {
console.log('inside hidden');
}
// We're outside of IIFEs function body here
// so NO code can be executed.
)();
答案 1 :(得分:0)
因为它只是一个解析/语法错误,如你所说,"意外标识符" 。您可以使用逗号运算符(function hidden() { ... }, hidden())
来解决此问题,但函数表达式中的hidden
名称(保存函数对象)将仅在函数范围内可用。你可以通过改为定义来解决这个问题:
(function() {
function hidden(){
console.log("hidden");
}
hidden();
})();
您也可以进行绑定定义。像...
ES4(reference interpreter版本):
{
let function hidden()
{
console.log("hidden");
}
hidden();
}
基于ES6的JavaScript
{
let hidden = function()
{
console.log("hidden");
}
hidden();
}
答案 2 :(得分:0)
可以通过访问函数的name属性来获得函数的名称:
IIFE:
(function hidden() {
console.log("Function name is: '" + hidden.name + "'"); //Function name is: 'hidden'
})();
console.log(hidden.name);//Error because IIFEs have their own private scope.
函数声明:
function available(){
return;
}
console.log(available.name);//"Available" - the console.log has access to the function's scope.
答案 3 :(得分:-1)
另一方面,以下内容完全有效:
(two = function() {
console.log('two');
},
console.log('one'),
two)()
答案 4 :(得分:-1)
您有语法错误,因为
(function hidden(){
console.log("hidden");
}
hidden();)
不是表达,而是
(function hidden(){
console.log("hidden");
})
是一个返回函数本身的表达式,您可以使用()
调用它。
您可以通过在两个部分之间添加逗号并删除分号来使其成为表达式。但是,hidden
只会在函数本身中定义,而您无法调用它。这称为named function expression
// Uncaught ReferenceError: hidden is not defined
(function hidden(){
console.log("hidden");
},
hidden())
您可能打算执行以下操作
(function() {
function hidden(){
console.log("hidden");
}
hidden();
})()
在这种情况下,您正在创建一个在包含IIFE中可见的函数声明