[英]eval calls function which calls eval which defines function
我知道這個標題聽起來很復雜,但為了保持動態,這個目的是為了放心;)
示例(請注意,假設這些示例代碼位於外部eval中)
//Ex1 this works
eval('function test (){}');
test();
//Ex2 this doesn't work (myfunction definition is written below)
myfunction();
test(); //I get an error
如果我全局定義myfunction(在外部eval之外),我會收到此錯誤:object不是函數
如果我在外部eval中定義myfunction,我會收到此錯誤:object不是函數
//myfunction definition
function myfunction () {eval('function test (){}');}
問題是:如何將函數定義的范圍擴展到其定義的函數之外? 我知道如何制作一個eval全局(請參閱下面的替代myfunction),但這看起來有點矯枉過正,我只想將范圍擴大到外部eval就是全部。 這可能嗎?
更新:示例只定義了一個保持簡單的函數,但我希望擴展它以便myfunction定義許多函數,並且它定義的函數取決於其他因素是動態的。 我還希望保留函數名稱和定義。 如果除了全局調用eval之外我找不到解決方案,我可能最終只將myfunction的內容放入外部eval中,然后我必須將內容復制到使用它的每個地方。
//making eval global works, but I had hoped to just upscope to the calling eval
function myfunction(){var globaleval=eval;globaleval('function test(){}');}
從最初的問題開始編輯以下內容:也許你可以在外部eval中創建一個var,讓myfunction將函數定義的地址返回給var。 但是,我希望保留函數名稱和定義。
好的,所以我假設你實際上是指你想要控制eval使用的范圍......
為什么不
eval.call(context, 'function test(){}');
例
eval.call(window, 'function test(){}');
eval()
確實在本地范圍內執行,但這不是你的問題。
首先,溝渠eval()
!
其次,在沒有eval()
情況下清楚地思考你想要什么。 更好的是,請在有問題時更新問題。
由於我無法理解這里的實際問題是一些猜測:
如果你想參考this
特定的對象和當前上下文是不夠的,然后使用類似這樣的問題 ,以“綁定”(包含在ECMA 5)新功能this
。
當然,你仍然會參考當地的關閉。
如果要調用范圍“遠離”或不同於“當前范圍”的函數,則在您希望它具有的范圍內定義“該函數” (閉包),然后使用對“該函數”的引用內在范圍有
例如
var test='outer';
var outer = function (){ alert(test);}
(function(){
var test='inner';
var inner = function(){
alert(outer());
}
inner();
})()
您會注意到inner()
在此示例中返回“outer”
在你的第二個例子中,函數test()
不存在,因為它還沒有定義)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.