whe*_*hys 9 javascript scope function strict
我是第一次以严格模式工作,而且,知道,这也是多年来第一次能够使用非严格模式属性将是有用的.我的问题在这里概述了我遇到的确切问题,但是如果我仍然可以访问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
}
})
Run Code Online (Sandbox Code Playgroud)
...使用命名函数表达式.这些在实现中是非常不可靠的(链接,链接)(它们不应该是,但是),最值得注意的是在上面的示例中,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};
}())
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的不希望函数有一个名字(我更喜欢它们有名字,帮助我的工具帮助我,但是嘿),你可以在该闭包中使用本地:
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};
}())
Run Code Online (Sandbox Code Playgroud)
现在您有一个匿名函数,但可以从中引用GS
它.再一次,我不推荐它,因为那时你看不到调用堆栈中的函数名称等等,但你确实说过没有给函数命名,所以...
归档时间: |
|
查看次数: |
6261 次 |
最近记录: |