gpt4 book ai didi

javascript - 在严格模式下复制 arguments.callee

转载 作者:数据小太阳 更新时间:2023-10-29 03:54:33 25 4
gpt4 key购买 nike

我是第一次在严格模式下工作,你知道吗,这也是多年来第一次能够使用非严格模式的属性。我的question here概述了我遇到的确切问题,但如果我仍然可以访问 arguments.callee,我已经制定的解决方案可以适用于更具可扩展性的东西。

在不命名函数的情况下,在严格模式下是否有任何方法可以获得对我当前范围内的函数的引用?

最佳答案

Without naming the function is there any way in strict mode that I can get a reference to the function whose scope I'm currently within?

2012 年 this answer was originally written ,您在链接解决方案中使用的命名函数表达式存在实现错误。现在没有了,自从带有这些错误的浏览器仍在大量流通以来,已经了。因此,在(非常)后 IE8 的世界中,您的命名函数表达式方法很好:

UsageGraph = Graph.extend({
generateScale: function GS() {
var parentMethod = this.constructor._super.generateScale;
if(parentMethod === GS) {
parentMethod = this.constructor._super.constructor._super.generateScale;
}
parentMethod.call(this); // run the parent's method
//do additional stuff
}
});

但问题是你是否可以避免有名字。在 2012 年,如果您真的不希望函数有名称,我的解决方案是将匿名函数分配给变量:

UsageGraph = Graph.extend(function(){
var GS = function() {
var parentMethod = this.constructor._super.generateScale;
if(parentMethod === GS) {
parentMethod = this.constructor._super.constructor._super.generateScale;
}
parentMethod.call(this); // run the parent's method
//do additional stuff
};

return {generateScale: GS};
}());

但这不再有效;自 ES2015 以来,即使是该函数也有一个名称,该名称是从分配给它的变量的名称推断出来的:

var GS = function() { };
console.log(GS.name); // "GS"

如果你真的不想让它有名字,可以避免它,但你必须努力打败规范定义的自动命名,例如通过制作函数另一个函数的返回值:

var GS = (() => function() { })();
console.log(GS.name); // ""

因此,如果避免使用名称很重要,您可以这样做:

UsageGraph = Graph.extend(function(){
const generateScale = (() => function() {
let parentMethod = this.constructor._super.generateScale;
if(parentMethod === generateScale) {
parentMethod = this.constructor._super.constructor._super.generateScale;
}
parentMethod.call(this); // run the parent's method
//do additional stuff
})();

return {generateScale};
}());

关于javascript - 在严格模式下复制 arguments.callee,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10009682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com