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'})
你想用第二段代码实现什么?“有一个错误,它表明隐藏的是一个意外的标识符。”---不,错误消息没有这样说。你的第二个代码块根本无效-如果是