我是第一次以严格模式工作,而且,知道,这也是多年来第一次能够使用非严格模式属性将是有用的。我的question here概述了我遇到的确切问题,但如果我仍然可以访问arguments.callee,那么我已经解决的解决方案可以适应更大规模的扩展。
如果没有命名函数,那么在严格模式下我可以获得对我目前所在范围内的函数的引用吗?
答案 0 :(得分:5)
如果没有命名函数,那么在严格模式下我可以获得对我目前所在范围内的函数的引用吗?
号。你必须给这个函数命名。我的错误,我想到了一种方法,请看下面的最后一个代码块。我不喜欢它,但我们有。 : - )
请注意,您在此处为函数命名的方式为:
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和更早版本将创建< strong>两个完全独立的函数对象,将其中一个赋值给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
。再说一遍,我不推荐它,因为那样你就看不到调用堆栈中的函数名等了,但是你确实说了而没有给函数命名,所以......
答案 1 :(得分:0)
是的,但不是......我不确定这是否与您所说的“命名”方式相同:
var foo = function bob() {
// call bob();
}
// bob is undeclared; here it's foo!