用户输入一个从中获取关键字的字符串,为此预先准备了一个类似名称的函数。有没有什么方法可以调用它eval()?
bubu("http://One.com/bubu.png");
function bubu(str) {
let key = (str.match(/(One|Two|Three)/ig) || ["Other"])[0];
window["handle" + "Test"](); // Работает для глобальной функции
bubu["handle" + key](); // Error. Где же сохраняется функция?
// *Должен сработать handleOne()
function handleOne() { console.log( 'one' ); }
function handleTwo() { console.log( 'two' ); }
function handleThree() { console.log('three'); }
function handleOther() { console.log('other'); }
}
function handleTest() { console.log( 'Window-test' ); }
ps 好吧,功能代码稍微复杂点和多样化,导致无法创建一个带参数的)
局部函数和变量不是用户代码中任何对象的属性......因此,
string如果不将它们放在对象中或使用eval.下面的内容并不完全是对所提问题的回答,而是关于对象中功能的部分评论:
其实看到这样的问题是很心酸的,想象一下手动组装js文件等资产的痛苦。毕竟,现在它很容易自动化:
我们将node安装到系统中(如果之前没有这样做过),然后进入项目文件夹,我们通过初始化它
$ npm init安装任何 bundler aka bundler ( Webpack / Rollup / Parcel /...) 并根据其文档的第一页准备项目。这只是几分钟的事情,但您也可以从 github 获取完整的样板
创建一个文件src/utils/helpers.js *,我们在其中声明和导出辅助函数:
$ npm run build) 或开发服务器 ($ npm start/$ npm run dev)。一般来说,汇编器不仅能够将几个 js 文件“拼接”成一个。作为一个相当通用的工具,它可以承担大量其他常规机械工作(处理 html 和 css 文件、图像、调用转译器/压缩器等)。
此外,开发模式下的流行构建器提供了方便的 LiveReload - 无需重新加载页面 :)
* 习惯上将所有源代码保存在 src/ 文件夹中,嵌套在其中的那些结构并不重要。但是“utils”文件夹的名称是可以识别的,而且不仅是人们可以识别的——例如,VS Code 会为它显示相应的图标(小事一桩,但仍然有助于更快地浏览项目文件夹树)。
** 并非所有模块导出都可以导入,但只能导入那些需要的模块。例如,
import { one, three } from './utils/handlers.js';这不仅是为了秩序,还有一个实际的好处:tree shaking bundler 会自己发现并丢弃死(未使用)的代码。因此,您可以将个人开发保留在通用模块中,并在不同的项目中部分使用它们 - 无需担心最终组装的体积。最好的部分是许多现代库也支持此类导入。
好吧,如果它在课堂上,那么我最好再决定,以免像@meine 的例子那样
this把各种各样的事情都围起来。this.actions在课堂上,ES6