Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符串创建javascript函数_Javascript_Jquery_Ajax - Fatal编程技术网

从字符串创建javascript函数

从字符串创建javascript函数,javascript,jquery,ajax,Javascript,Jquery,Ajax,我想通过ajax(使用jQuery)从文本文件加载javascript函数,但似乎无法正确实现 这是我想要从文本文件(abc.js)加载的javascript函数: 以下是我使用ajax读取文件的方式: $.getScript('abc.js', function (script) { var loaded_function = ??? }); 如何分配loaded_函数,以便使用loaded_函数调用my_alert。my_alert() 编辑 我不想创建新的标记或使用$.getS

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

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

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

$.getScript('abc.js', function (script) { 
    var loaded_function = ???
});
如何分配loaded_函数,以便使用
loaded_函数调用
my_alert
。my_alert()

编辑

我不想创建新的
标记或使用
$.getScript
的原因是
my_alert
然后就存在于全局上下文中。我希望它只存在于
{}
函数范围内

这可能吗

如何分配loaded_函数,以便可以使用loaded_函数调用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
    };
}

演示代码:

加载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");

您可以这样使用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()
});

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

var exposed = {
myFunc: function () {}
}
因此,“script”应该是函数,将其分配给var应该公开其作用域

var loaded_function = script.exposed
称之为:

loaded_function.myFunc();
您可以使用以下代码:

$.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');

这不是它的工作原理-仅加载您的
my_alert
功能将在您的全局上下文中可用。所以<代码>加载的\u函数=我的\u警报可以工作。如果它是一个字符串,您可以使用
eval
(危险)或
函数
构造函数来解析它。请看下面的讨论。为什么要这样做?为什么不使用ES6模块?我并不是说你应该使用
eval
,但是每个说“eval是危险的”的人都需要用“如果它用于用户输入”来限定它。不要害怕你不懂的东西。@这里有一些足够公平的东西。我唯一的希望是对话可能会从“eval是坏的”或“eval是坏的”变为“有更好/更安全/更快的方法来实现您的目标,而不使用eval”。鼓励人们不要使用它是可以的,但这只是因为通常确实存在更好的解决方案。所提供的理由应该是准确的,但这并不意味着它对学习者来说将是压倒性的。干杯。。我真正想做的是从一个文件(动态)加载我的js代码,然后将其设置为一个变量。这与此无关。用Ajax加载它并将其保存在局部变量上。Ajax。。。。(无论如何)当您在ajax的回调函数中构建了您的模块时,您将如何使用jquery/ajax加载JavaScript文件,并将其保存在局部变量上?好的。我觉得这里有点晦涩,但是文本是如何变成javascript的呢?使用jquery$.getScript,它通过使用eval(我猜是这样)来实现这一点,eval将它放在全局上下文中。但是如果我不想在全局上下文中使用它,而只是将它分配给加载文本的函数中的一个变量,我没有进行否决表决,但这看起来有点奇怪:var geval=eval;格瓦尔(脚本)。。。geval只是eval的一个引用,那么为什么不直接使用eval而直接使用它呢?我在这里发现它没有it函数,它不会出现在窗口中,因为它们是调用它的函数的本地函数。
loaded_function.myFunc();
$.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');