2012-04-04 94 views
8

我第一次在嚴格模式下工作,並且what-d'ya-know,它也是第一次在年齡中能夠使用非嚴格模式屬性將是有用的。我的question here概述了我遇到的確切問題,但是我已經制定的解決方案可以適應更多的可擴展性,如果我仍然可以訪問arguments.callee。在嚴格模式下複製arguments.callee

沒有命名的功能是否有任何方式在嚴格模式下,我可以得到一個函數,其範圍我目前在?

+0

你可以指定你的函數到一些變量。 – antyrat 2012-04-04 10:56:53

+0

進步是一件美好的事情。 – Rolf 2017-09-13 10:53:49

回答

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 
    } 
}) 

...使用命名函數表達式。這些都是非常不可靠(linklink)在不同的實現(他們不應是但),在你上面的例子最值得注意的是,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從內它。再說一遍,我不會推薦它,因爲那樣你不能在調用堆棧中看到函數名稱,但是你確實說了而沒有給函數一個名字,所以...

+1

對於 wheresrhys 2012-04-04 13:10:50

+0

@wheresrhys:(它是 2012-04-04 13:12:58

0

是的,但沒有...我不知道這是你說的「命名」相同的方式:

var foo = function bob() { 
    // call bob(); 
} 

// bob is undeclared; here it's foo! 

http://jsfiddle.net/4y8pY/

+3

使用IE8和更早版本時要小心,它會創建[兩個完全獨立的函數對象](http://blog.niftysnippets.org/2010/09/double-take.html),並在使用時泄露'bob'符號一個命名函數表達式。 – 2012-04-04 10:58:02

+0

另請注意,提問者說*「**沒有**命名功能」*(我強調)。 – 2012-04-04 11:00:01