Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数名是否存储在IIFE中?_Javascript_Identifier_Iife - Fatal编程技术网

Javascript 函数名是否存储在IIFE中?

Javascript 函数名是否存储在IIFE中?,javascript,identifier,iife,Javascript,Identifier,Iife,我的理解是,围绕函数声明的分组运算符强制将函数作为表达式进行求值。这就是允许执行括号操作符()工作的原因。但是,这种方法会使函数名无法在其外部访问。我想知道IIFE函数名与函数声明名相比是如何存储的,函数声明名在声明的范围内可用 (function hidden(){ console.log("function executed"); })() Angus Croll有一篇关于javascript()中函数声明和函数表达式之间的区别的好文章 基本上,您要做的是将函数hidden()视为

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

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

Angus Croll有一篇关于javascript()中函数声明和函数表达式之间的区别的好文章

基本上,您要做的是将函数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.
)();

Angus Croll有一篇关于javascript()中函数声明和函数表达式之间的区别的好文章

基本上,您要做的是将函数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.
)();

因为这只是一个解析/语法错误,正如您所说的“意外标识符”。您可以通过使用逗号运算符来解决此问题:
(function hidden(){…},hidden())
,但是函数表达式中的
hidden
名称(包含函数对象)将仅在函数范围内可用。您可以通过执行定义来解决此问题:

(function() {
    function hidden(){
        console.log("hidden");
    }
    hidden();
})();
您还可以执行绑定定义。像

ES4(构建):

基于ES6的JavaScript

{
    let hidden = function()
    {
        console.log("hidden");
    }
    hidden();
}

因为这只是一个解析/语法错误,正如您所说的“意外标识符”。您可以通过使用逗号运算符来解决此问题:
(function hidden(){…},hidden())
,但是函数表达式中的
hidden
名称(包含函数对象)将仅在函数范围内可用。您可以通过执行定义来解决此问题:

(function() {
    function hidden(){
        console.log("hidden");
    }
    hidden();
})();
您还可以执行绑定定义。像

ES4(构建):

基于ES6的JavaScript

{
    let hidden = function()
    {
        console.log("hidden");
    }
    hidden();
}

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

(两个=函数(){
console.log('two');
}, 
console.log('one'),

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

(两个=函数(){
console.log('two');
}, 
console.log('one'),

第二个()
您有一个语法错误,因为

(function hidden(){
    console.log("hidden");
}
hidden();)
不是一种表达,而是

(function hidden(){
    console.log("hidden");
})
是一个返回函数本身的表达式,您可以使用
()
调用它

您可以通过在两个部分之间添加逗号并删除分号将其变成表达式。但是,
hidden
将仅在函数本身中定义,您无法调用它。那叫一个

你可能打算做以下事情

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

在这种情况下,您正在创建一个函数声明,该声明在包含IIFE的

(function hidden(){
    console.log("hidden");
}
hidden();)
不是一种表达,而是

(function hidden(){
    console.log("hidden");
})
是一个返回函数本身的表达式,您可以使用
()
调用它

您可以通过在两个部分之间添加逗号并删除分号将其变成表达式。但是,
hidden
将仅在函数本身中定义,您无法调用它。那叫一个

你可能打算做以下事情

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

在这种情况下,您正在创建一个函数声明,该声明在包含的IIFE中可见。通过访问函数的name属性,可以使用函数的名称:

生命:

功能声明:

function available(){
    return;
}
console.log(available.name);//"Available" - the console.log has access to the function's scope.

通过访问函数的name属性可以使用函数的名称:

生命:

功能声明:

function available(){
    return;
}
console.log(available.name);//"Available" - the console.log has access to the function's scope.

您试图用第二段代码实现什么?“出现一个错误,说明隐藏是一个意外的标识符。”---不,错误消息没有这样说。您的第二个代码块根本无效-如果您移动了
hidden(){}
中,如果将
隐藏()
移到IIFE之外,那么,
隐藏的
当然是未定义的,这是由于命名函数表达式的范围,但是最终的
()
调用IIFE,那么为什么需要再次调用它呢?命名函数声明只在函数本身内部可见。下面是
(函数a(){console.log(a());返回'a'})
你想用第二段代码实现什么?“有一个错误,它表明隐藏的是一个意外的标识符。”---不,错误消息没有这样说。你的第二个代码块根本无效-如果是