我第一次在严格模式下工作,你知道吗,这也是多年来第一次能够使用非严格模式属性会很有用。我的问题在这里概述了我遇到的确切问题,但如果我仍然可以访问arguments.callee,我制定的解决方案可以适应更具可扩展性的东西。
在不命名函数的情况下,有什么方法可以在严格模式下获得对我当前范围内的函数的引用?
我第一次在严格模式下工作,你知道吗,这也是多年来第一次能够使用非严格模式属性会很有用。我的问题在这里概述了我遇到的确切问题,但如果我仍然可以访问arguments.callee,我制定的解决方案可以适应更具可扩展性的东西。
在不命名函数的情况下,有什么方法可以在严格模式下获得对我当前范围内的函数的引用?
在不命名函数的情况下,有什么方法可以在严格模式下获得对我当前范围内的函数的引用?
在 2012年最初编写此答案时,您在链接解决方案中使用的命名函数表达式存在实现错误。现在还没有,自从带有这些错误的浏览器仍然大量流通以来已经有好几年了。因此,在(非常)后 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};
}());
是的,但不是......我不确定这是否与您所说的“命名”方式相同:
var foo = function bob() {
// call bob();
}
// bob is undeclared; here it's foo!