功能名称是否存储在IIFE中?

问题描述 投票:2回答:5

据我所知,围绕函数声明的分组运算符强制将函数作为表达式求值。这是允许执行括号运算符()工作的原因。但是,此方法会删除函数名称,使其无法在外部访问。我想知道如何存储IIFE函数名称与函数声明名称相比,它们在声明的范围内可用。

(function hidden(){
    console.log("function executed");
})()
javascript identifier iife
5个回答
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.
)();

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();
}

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.

-1
投票

另一方面,以下内容完全有效:

(two = function() {
  console.log('two');
}, 
console.log('one'), 
two)()

-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中可见的函数声明

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.