从字符串创建javascript函数

时间:2016-04-26 13:56:58

标签: javascript jquery ajax

我想通过ajax(使用jQuery)从文本文件加载javascript函数,但似乎无法正确使用它。

这是我想从文本文件(abc.js)加载的javascript函数:

function my_alert() { alert 1; }

这是我使用ajax读取文件的方式:

$.getScript('abc.js', function (script) { 
    var loaded_function = ???
});

如何分配loaded_function以便我可以使用my_alert来呼叫loaded_function.my_alert()

修改

我不想创建新的<script>代码或使用$.getScript的原因是my_alert生活在全局范围内。我希望它只存在于{ }函数范围内。

这可能吗?

4 个答案:

答案 0 :(得分:0)

  

如何分配loaded_function以便我可以使用loaded_function.my_alert()调用my_alert?

使用此

的模块模式
# this is the module
function my_alert(){

    // Private section
    var loaded_function = ...

    // Public section which any instance can have access to  
    return{
       loaded_function: loaded_function
    };
}

<强> Demo code:

var my_alert = (function() {

    // Private section
    function private() {
        console.log('Private function ...')
    }

    // Public section which any instance can have access to
    return {
        public: private
    };
})();

my_alert.public();

加载JS文件并存储它:

(function(url, callback){

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
        if(this.readyState == 4 && this.status == 200){
            // Your file data is now in the :
            // this.responseText;
        }
    }

    xhr.open("GET", url, true);
    xmlHTTP.send();

})("url");

答案 1 :(得分:-1)

使用eval (这是危险的),如下所示:

$.getScript('abc.js', function (script) { 
    var loaded_function = eval(script);
});

您可以使用正常的分配方法

*仅当脚本包含类似

的函数定义时,此方法才有效
function myFunction(){/* some code*/}

代码将是:

$.getScript('abc.js', function () { 
    var loaded_function= myFunction;   //not = myFunction()
});

答案 2 :(得分:-1)

将函数包装在对象中是一种很好的做法。这样你就可以拥有例如:

var exposed = {
myFunc: function () {}
}

因此,'script'应该是函数,并将它分配给var应该暴露其范围。

var loaded_function = script.exposed

要打电话:

loaded_function.myFunc();

答案 3 :(得分:-1)

您可以使用此代码:

$.get('abc.js', function(script) {
    var loaded_function = {};
    var function_list = [];
    // save names of defined functions
    for (var key in window) {
        if (typeof window[key] == 'function' && !window[key].toString().match(/\[native code\]/)) {
            function_list.push(key);
        }
    }
    // use global eval https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
    var geval = eval;
    geval(script);
    for (var key in window) {
        if (typeof window[key] == 'function' && !window[key].toString().match(/\[native code\]/) &&
            function_list.indexOf(key) == -1) {
            loaded_function[key] = window[key];
            delete window[key];
        }
    }
    console.log(loaded_function.my_alert);
}, 'text');