Vue TypeScript使用eval函数遇到的问题

 更新时间:2023年01月27日 10:24:06   作者:jiyanglin  
近几年前端对 TypeScript的呼声越来越高,Typescript也成为了前端必备的技能。TypeScript是JS类型的超集,并支持了泛型、类型、命名空间、枚举等特性,弥补了 JS 在大型应用开发中的不足

正常情况下,项目里不会用eval函数,但是万一要调用一个全局的js库,就需要用eval做些骚操作,这个时候编译会提示:is strongly discouraged as it poses security risks and may cause issues with minification.

警告是可以忽略,刚开始我也没当回事,有风险就有风险,可控,我知道自己写的是啥。但是,今天我改代码的时候出了问题。就是dev时候正常,但是打包以后,不按照预期执行,编译出来的代码就不是我要的逻辑。

问题的关键是:使用eval的函数不能是全局函数(需要包装在一个对象里),然后这个函数内容要简单,不要里面定义各种变量,然后被eval调用,免得被编译时候优化掉

简单的代码实例问题

上一段简单的代码:

<template>
  <div>
    <button @click="btn">测试</button>
  </div>
</template>
<script setup lang="ts">
function myfun(param:number){
    let ret = 0
    eval("ret = param+1")
    return ret;
}
function btn() {
  let ret = myfun(1);
  console.log(ret);
}
</script>

dev运行在浏览器点击按钮,输出2,没毛病

然后打包以后,运行就会是这样,输出为NaN

缩成一坨的这个代码里面,把我的myfun函数编译成了这样,也没毛病:

function myfun(param){let ret=0;return eval("ret = param+1"),ret }

但是,调用时候变成了这样!!!!

myfun调用的时候,传入的参数哪里去了???

let e=myfun();console.log(e)

因为没有参数进入,eval里的param+1结果就变成了NaN

解决方法

把代码改成这样,函数包装到一个对象里面:

<template>
  <div>
    <button @click="btn">测试</button>
  </div>
</template>
<script setup lang="ts">
const FunPack = {
  myfun(param:number){
    let ret = 0
    eval("ret = param+1")
    return ret;
  }
}
function btn() {
  let ret = FunPack.myfun(1);
  console.log(ret);
}
</script>

然后打包运行,输出为2正常:

这个时候调用变成这样,myfun的时候传的参数正常

let e=FunPack.myfun(1);console.log(e)

问题的原理

感觉上,对于调用一个不在对象里的函数,typescript编译时候进行了更多优化,对于myfun函数,里面eval函数那一行没有类型系统,等于没有,所以编译时候理解成下面这样,等于没有eval那一行。等于param没有被使用,所以调用函数时候,觉得这个参数没有用,就给吃了。。。

function myfun(param:number){
    let ret = 0
    return ret;
}

同理,如果myfun里面定义了别的变量,用来给eval使用,但是别的地方没有使用,编译时候,这个变量就会被编译器认为无效,然后被吃掉,比如myfun定义成这样,打包运行就会报错dat is not defined

function myfun(param:number){
    let ret = 0
    let dat = param + 10;
    eval("ret = dat+1")
    return ret;
}

一劳永逸的方法

虽然通过把函数封装到对象,可以解决问题,但是,也说不好ts编译器后续会不会关于对象的方法调用也进行这种优化。

所以还有一个解决方法,就是在函数里把param用一下,让编译器觉得它被使用了,别吃掉。

比如改成这样,把param输出一下。。。

function myfun(param:number){
    let ret = 0
    console.debug(param);
    eval("ret = param+1")
    return ret;
}

到此这篇关于Vue TypeScript使用eval函数遇到的问题的文章就介绍到这了,更多相关Vue TypeScript使用eval函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue3开发必备的六个VSCode插件推荐

    Vue3开发必备的六个VSCode插件推荐

    在VSCode中添加好用的插件可以提高我们的开发效率,这些可以帮助我们格式化,扩充性,执行最佳实践的代码方式,自动完成一些琐碎的事情,下面这篇文章主要给大家推荐介绍了关于Vue3开发必备的六个VSCode插件,需要的朋友可以参考下
    2022-12-12
  • vue2和vue3组件v-model区别详析

    vue2和vue3组件v-model区别详析

    v-model通常用于input的双向数据绑定,它并不会向子组件传递数据,下面这篇文章主要给大家介绍了关于vue2和vue3组件v-model区别的相关资料,需要的朋友可以参考下
    2023-06-06
  • vue实现移动端H5数字键盘组件使用详解

    vue实现移动端H5数字键盘组件使用详解

    这篇文章主要为大家详细介绍了vue实现移动端H5数字键盘组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • elementui中el-input回车搜索实现示例

    elementui中el-input回车搜索实现示例

    这篇文章主要介绍了elementui中el-input回车搜索实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • element table多层嵌套显示的实践

    element table多层嵌套显示的实践

    本文主要介绍了element table多层嵌套显示的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • vue3使用Electron打包成exe的方法与打包报错解决

    vue3使用Electron打包成exe的方法与打包报错解决

    在前端开发中,Electron是一种常用的工具,它允许开发者使用Web技术构建桌面应用程序,本文主要介绍了vue3使用Electron打包成exe的方法与打包报错解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • VUE中操作dom元素的几种方法(最新推荐)

    VUE中操作dom元素的几种方法(最新推荐)

    本文给大家总结了Vue中操作dom元素的多种方法,每种方法结合实例代码给大家讲解的非常详细,需要的朋友参考下吧
    2022-12-12
  • vue阻止重复请求实现示例详解

    vue阻止重复请求实现示例详解

    这篇文章主要为大家介绍了vue阻止重复请求实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • swiper/vue 获取 swiper实例方法详解

    swiper/vue 获取 swiper实例方法详解

    在网上搜了一下如何调用swiper实例,大部分都是通过 swiperRef = new Swiper(‘.swiper’, options) 这种方法初始化swiper,然后直接能用 swiperRef 实例,这篇文章主要介绍了swiper/vue 获取 swiper实例方法详解,需要的朋友可以参考下
    2023-12-12
  • uniapp中设置全局页面背景色的简单教程

    uniapp中设置全局页面背景色的简单教程

    uni-app如何设置页面全局背景色,其实非常简单,一句话即可,但有时候也会踩一些坑,这篇文章主要给大家介绍了关于uniapp中设置全局页面背景色的相关资料,需要的朋友可以参考下
    2023-03-03

最新评论