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

时间:2017-06-16 00:01:55

标签: javascript identifier iife

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

(function hidden(){
    console.log("function executed");
})()

5 个答案:

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