簡體   English   中英

eval調用函數調用定義函數的eval

[英]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()情況下清楚地思考你想要什么。 更好的是,請在有問題時更新問題。

由於我無法理解這里的實際問題是一些猜測:

1.對特定對象的引用

如果你想參考this特定的對象和當前上下文是不夠的,然后使用類似這樣的問題 ,以“綁定”(包含在ECMA 5)新功能this

當然,你仍然會參考當地的關閉。

2.具有特定閉包的函數

如果要調用范圍“遠離”或不同於“當前范圍”的函數,則在您希望它具有的范圍內定義“該函數” (閉包),然后使用對“該函數”的引用內在范圍有

例如

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM