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(执行)的做事方式。所以我感到困惑。有人能回顾一下这个答案吗?