簡體   English   中英

JavaScript閉包 - Eval()和捕獲Eval()范圍內的變量

[英]JavaScript Closure - Eval() and capturing variables in Eval()'s scope

我的問題是關於JavaScript閉包和Eval()函數。

我有一些代碼看起來像這樣,還有一些其他jQuery插件相關的代碼taht沒有顯示。 如果需要,我可以用更多代碼更新問題。

var _CurrentDataRowIndex = 1;

function LoadParsedRowTemplate(rowData, type) {

    var result;
    var asyncbinder = /&\{[\S\s]*?}&/g;

        while ((result = asyncbinder.exec(template)) != null) {
            replacement = eval("$.fn.ScreenSetup." + result[0].substring(2, result[0].length - 3) + ", rowData, " + _CurrentDataRowIndex + ")");
            template = template.replace(result[0], "AsyncBind!!");
            asyncbinder.lastIndex = 0;
        }

}

function AsynchronousBind(asyncFunc, args, rowData, rowIndex) {

    var watchTimer;

    asyncFunc.apply(this, Array.prototype.slice.call(args.FunctionArgs, 0));

    watchTimer = setInterval(function () {

        if (args.finished) {
            clearTimeout(watchTimer);
        }
        else {
            try {
                console.log("watching the async function for a return on row: " + rowIndex);
            }
            catch (err) {
            }
        }

    }, 1000);

}

Eval沒有捕獲rowData和_CurrentDataRowIndex,當調用AsynchronousBind函數時,兩者都是未定義的。 eval如何使用閉包? 我想知道為什么在AsynchronousBind中未定義rowData和rowIndex參數。

編輯:

我知道eval()的爭議本質,但這是針對防火牆應用程序的背后,我正在添加一個我們已經編寫的插件,它使用eval來解析包含HTML和JavaScript的模板。

以下是傳遞給eval()的字符串示例:

 "$.fn.ScreenSetup.AsyncBind( _CurrentDataRow.isPromotionAvailable, {
     'FunctionArgs': {'doAsync' : true, 
                      'finished' : false}, 
      'Property': 'isPromotionAvailable()', 
      'ControlType': 'TextBox', 
      'ControlIdPrefix': 'promoAvail'}, rowData, 3)"

編輯(固定):

意識到當我添加rowData並且rowItem II忘記在我的插件中更改以下內容時:

var asyncMethods = {
    AsyncBind: function (func, args) { return AsynchronousBind(func, args) }
}

應該是:

var asyncMethods = {
    AsyncBind: function (func, args, rowData, rowIndex) { return AsynchronousBind(func, args, rowData, rowIndex) }
}

更新它修復了AsyncBind函數中的未定義引用。

了解eval范圍是一篇有趣的文章。 它表明瀏覽器的范圍不一致。 如果必須使用eval,則應注意僅依賴於它在全局范圍內,並且不要在本地范圍內重用全局變量名稱,以防它在本地進行求值。

更好的是,只是不要使用eval。 你可能還有其他選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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