从字符串创建javascript函数
我想通过ajax(使用jQuery)从文本文件加载javascript函数,但似乎无法正确实现 这是我想要从文本文件(abc.js)加载的javascript函数: 以下是我使用ajax读取文件的方式:从字符串创建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
$.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');