JS 执行脚本
在现在项目中执行脚本的情况比较少。但是如果有这样的要求,我们应该如何实现。
对于这个问题是鉴于有一个项目中实际遇到,就深入了解下。
一、eval
eval 是全局对象的一个函数属性。
eval 接收的是一个字符串的脚本,如果不是字符串,会直接返回。
console.log(eval('2+2')) // 4 console.log(eval(new String('2+2'))) // [String: '2+2']
eval 还有一些很大的问题缺陷:
1、执行较慢(必须调用 JS 解释器)
2、安全问题(使用与调用者相同权限执行代码,这样会导致恶意代码被执行)
所以建议谨慎或者不使用 eval!
二、Function
在 JS 中每一个函数都是 Function 对象。
我们在写代码的时候用的:函数声明、函数表达式、箭头函数等写的都是 Function 对象。
function add(x, y) { return x + y } console.log(add.constructor === Function) // true let add1 = function (x, y) { return x + y } console.log(add1.constructor === Function) // true let add2 = (x,y)=>{ return x + y } console.log(add2.constructor === Function) // true
那么我们也可以直接用 Function 构造函数动态的创建函数。
/** * Function([arg1[,arg2...]],functionBody) * 1、前面的是动态创建函数的参数 * 2、要创建的函数的函数体 */ const adder = new Function('a','b','return a+b') console.log(adder.constructor === Function) // true
Function 和 eval 是有区别的:
1、接收参数不一样:Function 的函数体是可以接收字符对象,eval 只能是字符
2、eval 是直接执行传入的语句等,Function 是创建了一个函数(根据需要是否有返回 return 不能忘记)
3、Function 是在全局执行的(只能访问全局变量和自己变量,创建这个函数的作用域也不可以),eval 有自己调用的作用域(这个地方不安全,会被第三方查看)
const adder1 = new Function('a','b',new String('return a+b')) console.log(adder1(3,4)) // 7 可以接收 String 对象 // 需要在浏览器环境下执行 var x = 5 function createFun() { var x = 10 return new Function('return x;') } const fun1 = createFun() console.log(fun1()) // 5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端