我第一次在严格模式下工作,知道了,这也是很久以来第一次能够使用非严格模式属性了。我的question here概述了我所遇到的确切问题,但是如果我仍然可以访问arguments.callee,则可以将我制定的解决方案改编为可扩展性更高的解决方案。
在不命名函数的情况下,在严格模式下是否有任何方法可以获取对我当前作用域内的函数的引用?
最佳答案
否。您必须给函数命名。我想到的是我的错误,请参见下面的最终代码块。我不喜欢,但我们在那里。 :-)
请注意,您在此处为函数命名的方式是:
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
}
})
...使用命名函数表达式。众所周知,它们在实现中(它们不应该,但是是)不可靠(link,link),在上面的示例中,最值得注意的是,IE8和更早的版本将创建两个完全独立的函数对象,并将其中一个分配给
generateScale
属性并将函数中的另一个函数对象称为GS
。修复起来很容易,但是:
UsageGraph = Graph.extend(function(){
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
}
return {generateScale: GS};
}())
或者,如果您确实不希望函数具有名称(我更喜欢它们具有名称helps my tools help me,但是,嘿),则可以在该闭包中使用局部变量:
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};
}())
现在您有了一个匿名函数,但是可以在其中将其称为
GS
。再一次,我不推荐这样做,因为那样一来,您就无法在调用堆栈等中看到函数名称,但是您确实说了没有给函数命名的意思,所以...关于javascript - 在严格模式下复制arguments.callee,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10009682/