Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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 在es2015中,`const func=foo=>;bar`make`func`是一个命名函数,如何绕过它?_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 在es2015中,`const func=foo=>;bar`make`func`是一个命名函数,如何绕过它?

Javascript 在es2015中,`const func=foo=>;bar`make`func`是一个命名函数,如何绕过它?,javascript,ecmascript-6,Javascript,Ecmascript 6,有没有办法避免这种行为 > foo => bar; [Function] > const func = foo => bar; undefined > func [Function: func] 我有一段代码,可以临时存储这样的匿名函数,然后返回它。我不希望变量名的实现细节像这样公开。避免这种情况而不影响代码结构的最简单方法可能是使用identity函数包装定义: const id = x => x; const func = id( foo =>

有没有办法避免这种行为

> foo => bar;
[Function]
> const func = foo => bar;
undefined
> func
[Function: func]

我有一段代码,可以临时存储这样的匿名函数,然后返回它。我不希望变量名的实现细节像这样公开。

避免这种情况而不影响代码结构的最简单方法可能是使用identity函数包装定义:

const id = x => x;

const func = id( foo => bar );
console.log(func.name) // undefined
如果不想声明助手函数,也可以将其内联,或使用IIFE:

const func1 = (f=>f)( foo => bar );
const func2 = (()=> foo => bar )();
但基本上任何东西(括号中的表达式)都可以:

(当你这么做的时候,别忘了添加一条适当的评论,解释你为什么这么做)


当然,这可能不会阻止调试器或控制台推断函数的其他内部名称。

在不影响代码结构的情况下避免这种情况的最简单方法可能是使用identity函数包装定义:

const id = x => x;

const func = id( foo => bar );
console.log(func.name) // undefined
如果不想声明助手函数,也可以将其内联,或使用IIFE:

const func1 = (f=>f)( foo => bar );
const func2 = (()=> foo => bar )();
但基本上任何东西(括号中的表达式)都可以:

(当你这么做的时候,别忘了添加一条适当的评论,解释你为什么这么做)


当然,这可能不会阻止调试器或控制台推断函数的其他内部名称。

这与ECMAScript无关

确实,当您为匿名函数分配变量时,函数的
名称将设置为变量的名称(感谢@loganfsmyth的更正)

由于
name
是一个可配置的属性,因此可以将其删除。但是,这是没有用的,因为
name
是不相关的

例如,Firefox尚未实现将匿名函数命名为变量,因此在您的示例中,
name
是空字符串。但是当您记录函数时,控制台仍然显示
function func()

事实上,“问题”在于浏览器希望使调试代码更容易,因此他们的控制台推断出函数的名称(不一定是
名称

给出了以下推理示例:

匿名函数不再需要为调试命名

函数f(){}//显示名称:f(给定名称)
var g=函数(){};//显示名称:g
o、 p=函数(){};//显示名称:o.p
变量q={
r:function(){}//显示名称:q.r
};
函数h(){
var i=function(){};//显示名称:h/i
f(函数(){});//显示名称:h/<
}
var s=f(函数(){});//显示名称:s<

浏览器的控制台未被ECMAScript标准化,因此您无法修改此行为。

这与ECMAScript无关

确实,当您为匿名函数分配变量时,函数的
名称将设置为变量的名称(感谢@loganfsmyth的更正)

由于
name
是一个可配置的属性,因此可以将其删除。但是,这是没有用的,因为
name
是不相关的

例如,Firefox尚未实现将匿名函数命名为变量,因此在您的示例中,
name
是空字符串。但是当您记录函数时,控制台仍然显示
function func()

事实上,“问题”在于浏览器希望使调试代码更容易,因此他们的控制台推断出函数的名称(不一定是
名称

给出了以下推理示例:

匿名函数不再需要为调试命名

函数f(){}//显示名称:f(给定名称)
var g=函数(){};//显示名称:g
o、 p=函数(){};//显示名称:o.p
变量q={
r:function(){}//显示名称:q.r
};
函数h(){
var i=function(){};//显示名称:h/i
f(函数(){});//显示名称:h/<
}
var s=f(函数(){});//显示名称:s<

浏览器的控制台不是ECMAScript标准化的,因此您不能修改此行为。

您想要的最终结果是什么?公开它有什么问题?@7zark7参考repl示例,
func
应该显示
[Function]
,而
func.name
应该是
'
。这就是它在es5中的工作方式。@KitSunde正如标题所说,这是关于ES2015的<添加了代码>名称
推理,它根据函数的分配方式命名函数。您想要的最终结果是什么?公开它有什么问题?@7zark7参考repl示例,
func
应该显示
[function]
,而
func.name
应该是
'
。这就是它在es5中的工作方式。@KitSunde正如标题所说,这是关于ES2015的<添加了代码>名称
推断,该推断根据函数的分配方式命名函数。我可能错了,但我认为
id
在这里没有任何作用。如果没有它,你可能会得到同样的结果。@Asad:这就是重点,它并没有真正改变评估的语义;然而,它确实改变了语法的语义,因为它避免了在赋值的右侧放置匿名函数表达式,这会阻止它被赋值为
。name
@Asad:FF还没有完全的ES6支持(我不知道有哪个引擎支持)。特别是,它@zerkms:没有带箭头函数的Y组合子糟糕:-),甚至
constfunc=(0,foo=>bar)如果你想避免IIFE/函数调用。我可能错了,但我不认为
id
在这里真的做了什么。如果没有它,你可能会得到同样的结果。@Asad:这就是重点,它并没有真正改变评估的语义;但它确实改变了语法的语义,避免了