如何从该函数内部访问函数名?
// parasitic inheritance
var ns.parent.child = function() {
var parent = new ns.parent();
parent.newFunc = function() {
}
return parent;
}
var ns.parent = function() {
// at this point, i want to know who the child is that called the parent
// ie
}
var obj = new ns.parent.child();
Run Code Online (Sandbox Code Playgroud) 从ES2015(ES6)开始,函数具有适当的名称(包括官方name属性),除了明显的函数声明和命名函数表达式(例如赋值给变量)之外,还以各种方式创建函数时分配名称(函数的名称设置为变量的名称),分配给对象属性(函数的名称设置为属性的名称),甚至函数参数的默认值(函数的名称设置为参数的名称).但是,在现有对象上(例如,不在对象初始值设定项中)分配属性不会将该属性的名称分配给该函数.为什么不?当然必须有一个特定的理由,这是不可取的/可能的.它以前如何?
要明确:我不是在问如何解决它.我问是什么阻止了这个看似很明显的案例在被许多其他人(包括默认参数值!)处理时被处理.一定有充分的理由.
请不要推测或理论化.TC39有理由不包括它.我对这个原因感兴趣.我已经通过了TC39会议记录,但还没有找到它.到目前为止,我发现的最接近的是艾伦· 威尔夫斯 - 布洛克回复贝尔吉说,由于"各种反对意见",没有就此形式达成共识,但遗憾的是他没有说出那些反对意见.
细节:
以下所有内容都foo在兼容的浏览器上为该功能指定名称:
// Requires a compliant browser
// Assigning to a variable or constant...
// ...whether in the initializer...
{
let foo = function() { };
console.log("1:", foo.name); // "foo"
}
{
const foo = function() { };
console.log("2:", foo.name); // "foo"
}
// ...or later...
{
let foo;
foo = function() { };
console.log("3:", foo.name); // "foo"
}
// As …Run Code Online (Sandbox Code Playgroud)javascript performance google-chrome google-chrome-devtools angular
为什么导出的箭头函数不保留其名称,是否有办法让它们这样做?
给出如下的ES6模块:
myModule.js
export function doSomeWork1() {
}
export const doSomeWork2 = () => {
};
Run Code Online (Sandbox Code Playgroud)
如果我然后将它们导入到另一个文件中,那么导出的函数会保留其名称,而箭头函数则不会.
example.js
import { doSomeWork1, doSomeWork2 } from './myModule';
console.log('doSomeWork1...');
console.log(doSomeWork1);
console.log(doSomeWork1.name); // name is retained
console.log('doSomeWork2...');
console.log(doSomeWork2);
console.log(doSomeWork2.name); // name is NOT retained
Run Code Online (Sandbox Code Playgroud)
输出:
doSomeWork1...
[Function: doSomeWork1]
doSomeWork1
doSomeWork2...
[Function]
Run Code Online (Sandbox Code Playgroud)
如果我在ES6模块中声明一个箭头函数而不导出它并直接在该文件中打印它确实保留了它的名字.
myModule.js
const doSomeWork3 = () => {
};
console.log('doSomeWork3...');
console.log(doSomeWork3);
console.log(doSomeWork3.name); // name is retained
Run Code Online (Sandbox Code Playgroud)
输出:
doSomeWork3...
[Function: doSomeWork3]
doSomeWork3
Run Code Online (Sandbox Code Playgroud) 我一直试图了解es6箭头功能.我读了一些介绍它的文章.但我仍然没有完全得到它.
例如,我有这个代码:
sortedArticles(): Article[] {
return this.articles.sort((a: Article, b: Article) => b.votes - a.votes);
}
Run Code Online (Sandbox Code Playgroud)
它对下面的数组进行排序:
[
new Article('Angular 2', 'http://angular.io', 3),
new Article('Fullstack', 'http://fullstack.io', 2),
new Article('Angular Homepage', 'http://angular.io', 1),
];
Run Code Online (Sandbox Code Playgroud)
如何在普通的旧js中看到相同的代码?我无法完全得到它.
我正处于js的学习之路,刚开始使用yeoman发电机.我使用gulp进行预处理和其他工作.当我浏览gulpfile.js时,我发现了这段代码.
gulp.task('serve', ['styles', 'html', 'watch'], () => {
browserSync({
notify: false,
port: 9000,
server: {
baseDir: 'app'
}
})
});
Run Code Online (Sandbox Code Playgroud)
我可以理解,当我们执行时gulp-serve,它会运行样式,html和监视任务,并在端口9000中打开一个开发服务器.
但我不明白这() =>意味着什么.
如果有人能告诉我这意味着什么,将非常感激.
提前致谢.
我正在阅读关于箭头函数(在打字稿上下文中).我遇到了这条线.
每个Handler类型的对象都会创建箭头函数.另一方面,方法只创建一次并附加到Handler的原型.它们在Handler类型的所有对象之间共享.
资料来源:https://www.typescriptlang.org/docs/handbook/functions.html
我无法理解.请回答是否有人可以解释.
我有一个带有react-native的tsx文件。如果函数未设置为const或不显示此消息,则我的函数名称带有下划线:
找不到名称“ goBack”
goBack = () => {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
但是如果我设置const或让它起作用,它将起作用:
const goBack = () => {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
为什么呢
我亲眼目睹了这种行为,后来发现了匿名函数(最显着的是新的箭头函数)的“名称推断”概念,但我一直无法找到这种行为的定义位置。以供参考:
// Arrow functions are inherently anonymous so this shouldn't work
const foo = () => {};
console.log(foo.name); // outputs "foo"
const bar = function() {};
console.log(bar.name); // outputs "bar"
// vs
console.log((() => {}).name) // outputs ""
console.log((function() {}).name) // outputs ""
Run Code Online (Sandbox Code Playgroud)
我发现的最接近的东西是在MDN 上,它将它归因于“ECMAScript 2015 中的新内容”。我试图搜索ES2015 规范,但没有运气。这似乎是现代 ES 的一个很大程度上未知但有用的功能,实际上几乎没有相关文档。
任何人都可以为此提供对规范规范的参考吗?
以下讨论:
我对JavaScript中的函数声明有疑问.
通过匿名函数声明我的意思是这样的(https://en.wikibooks.org/wiki/JavaScript/Anonymous_Functions):
var myFunction = function (fruit){
alert('I like ' + fruit);
}
Run Code Online (Sandbox Code Playgroud)
而const我的意思是:
const myfunction = (fruit) => alert('I like ' fruit);
Run Code Online (Sandbox Code Playgroud)
使用匿名函数或使用const更快吗?我已经读过使用const允许在JavaScript中进行编译优化.有什么理由我应该使用一个而不是另一个?
这甚至是相关的吗?
我刚才了解到,写下这个:
const setName = name => {
// set name here
}
Run Code Online (Sandbox Code Playgroud)
与此相反,这是坏事
function setName(name) {
//set name here
}
Run Code Online (Sandbox Code Playgroud)
原因是第一种方法使调试与该函数相关的问题变得困难,因为它不会出现在堆栈跟踪中.
问题:为什么这不会出现在堆栈跟踪中?
我试图用构造函数函数定义一个函数,如下所示,但为什么函数的名称返回匿名?
let sayHi = new Function('alert("Hello")');
//this will return anonymous
sayHi.name
Run Code Online (Sandbox Code Playgroud) 我正在侦听文件输入中的更改,并且每次需要“监听”某些内容后,都需要删除该侦听器。
问题在于,使用命名函数(无法删除匿名函数上的侦听器)时,我失去了上下文,因此无法访问状态。这是基本版本:
$ImgEl.on('change', () => {
const reader = new FileReader();
reader.onloadend = (e) => {
// Do some stuff with state
this.state.whatever;
}
}
Run Code Online (Sandbox Code Playgroud)
通过将此代码与箭头功能配合使用,我可以维护上下文并因此可以访问自己的状态。但是,如果使用命名函数,则可以删除监听器,但会丢失上下文。
还有其他人处理过吗?
javascript ×12
ecmascript-6 ×4
function ×3
typescript ×2
angular ×1
class-method ×1
const ×1
gulp ×1
jquery ×1
performance ×1
react-native ×1
sorting ×1
tsx ×1