Javascript 如何在变量中捕获HTML脚本标记的结果?
我一直在阅读关于Javascript 如何在变量中捕获HTML脚本标记的结果?,javascript,asynchronous,amd,Javascript,Asynchronous,Amd,我一直在阅读关于requirejs等实现的文章。大部分资源包括用法和API 但是,在实现这一点时,如何将JavaScript文件加载到这样的变量中呢?例如,您可以看到如下函数: define(['jquery'], function($){ }); var jquery = require('./jquery'); var str = "if (x == 5) {console.log('z is 42'); z = 42;} else z = 0;"; console.log('z is
requirejs
等实现的文章。大部分资源包括用法和API
但是,在实现这一点时,如何将JavaScript文件加载到这样的变量中呢?例如,您可以看到如下函数:
define(['jquery'], function($){
});
var jquery = require('./jquery');
var str = "if (x == 5) {console.log('z is 42'); z = 42;} else z = 0;";
console.log('z is ', eval(str));
从API消费者的角度来看,我所能理解的就是文件jquery.js
神奇地变成了$
,jquery
等等?这是如何实现的
任何例子都会有帮助
这本书很有帮助
编辑:我认为下面的
eval
答案很好,因为它实际上在某些方面是一个eval
问题。但是我想从实现的角度来了解这一点。您知道如何说eval(alert(“hello!”)
并执行代码吗
您还可以:
var str = "hello!"
eval('alert("' + str + '");')
因此,下一步是创建一个包含实际脚本的文件:
var str = "hello"
alert(str)
然后,您可以使用标准AJAX请求将该文件提取到变量中,并且可以eval()
该变量
从技术上讲,
eval()
被认为是邪恶的——充满了危险——但还有其他解决方案(例如,将脚本标记注入文档体)。我只是在这里使用了eval()
来简化解释。您不需要将javascript文件加载到变量中,而是通过诸如browserify或webpack之类的操作来完成。Javascript本身可以做到这一点,但这些模块生成一个包含所有代码的文件。通过调用require(“file”)
,可以调用browserify的函数来加载代码中存储的名为“file”的文件
例如,如果您有一个模块
function demoModule(){
console.log("It works!");
}
module.exports = demoModule
这使得module.exports现在包含文件的“全部”内容
Browserify/webpack将其放入一个函数中,该函数返回该文件的module.exports
函数要求(文件名){
开关(文件名){
案例“demofile”:
let module={exports:{};((module)=>{
函数demoModule(){
log(“它能工作!”);
}
module.exports=demoModule
})(单元)
返回模块。导出;
}
};
要求(“演示文件”)()代码>扩展他们所说的内容
大概是这样的:
define(['jquery'], function($){
});
var jquery = require('./jquery');
var str = "if (x == 5) {console.log('z is 42'); z = 42;} else z = 0;";
console.log('z is ', eval(str));
更多阅读
但是要非常谨慎地使用eval()
,并绝对确定eval()
的缺陷和缺点
除非它是唯一的选择,否则不要使用它
也请阅读此文。定义的工作方式不是将“HTML脚本加载到变量中”。通常,一个普通的脚本可以有多个变量,因此捕获一个变量的值是没有意义的!如果需要,eval
方法可能会执行类似的操作。它捕获了JavaScript源代码中的所有内容
AMD
的真正关键在于define
API将名称映射到函数。无论何时需要使用该名称,它都会调用该函数并将值返回给您。此返回值应为模块
。这是一个惯例,使一切工作
换句话说,AMD使用了一种有趣的约定(设计模式)来确保我们在JavaScript代码中获得模块化效果。这是间接的一个层次。与通常的“编写代码并在全局范围内执行”范例不同,您只需编写一个函数,返回一个值,该值捕获您希望作为模块向消费者公开的所有内容 你确定他们需要在变量中包含文件的内容吗?最终,“it”会作为单个变量注入函数中,对吗?eval
很有趣。但我想知道这是否可以做得更好。即使在eval
的情况下,您仍然必须将文件作为字符串读取。可能吗?我只看过脚本
,这是一种魔力。嗯……我想我不明白你在要求什么。希望这里的其他一些答案能够澄清您的问题。使用一个大文件而不是20个文件实际上可以提高性能。HTTP请求越少,加载页面所需的时间就越少,同时牺牲了延迟加载。您的意思是说,需要某种编译来实现这一点吗?另外,如果我们把它变成一个文件,像延迟加载这样的事情怎么可能呢?它应该是模块化的,对吗?模块化在您的代码中,但编译后,它会被放在一个大文件中的所有函数中。汇编是必要的。无论如何,通过babel之类的工具运行代码是一种很好的做法,这样旧的浏览器就可以使用新的JS功能。你是说AMD
实现使用eval
?@Nishant no。我没那么说,好吧。问题主要是关于AMD(执行)的做事方式。所以我感到困惑。有人能回顾一下这个答案吗?