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:这就是重点,它并没有真正改变评估的语义;但它确实改变了语法的语义,避免了