位置: 编程技术 - 正文

JavaScript中的eval()函数详解(JavaScript中的NaN代表什么)

编辑:rootadmin

eval(“1+2”),-> 3

动态判断源代码中的字符串是一种很强大的语言特性,几乎没有必要在实际中应用。如果你使用了eval(),你应当仔细考虑是否真的需要使用它。

一、eval()是一个函数还是一个运算符

eval()是一个函数,但由于它已经被当成运算符来对待了。。JavaScript语言的早期版本定义了eval函数,现代JavaScript解释器进行了大量的代码分析和优化。而eval的问题在于,用于动态执行的代码通常来讲不能分析,换句话说,如果一个函数调用了eval,那么解释器将无法对这个函数做进一步优化,而将eval定义为函数的另一个问题是,它可以被赋予其他的名字,var f=eval;那么解释器就无法放心的优化任何调用了f()的函数。而当eval是一个运算符的时候,就可以避免这些问题。

二、eval()

eval()只有一个参数。如果传入的参数不是字符串,它直接返回这个函数。如果参数是字符串,它会把字符串当成JavaScript代码进行编译,如果编译失败者抛出一个语法错误异常。如果编译成功,则开始执行这一段代码,并返回字符串中的最后一个表达式会或语句的值,如果最后一个表达式或语句没有值,则最终返回undefined。如果字符串抛出一个异常,这个异常将把该调用传递给eval()。

关于eval最重要的是,它使用了调用它的变量作用域环境。也就是说,它查找变量的值和定义新变量和函数的操作和局部作用域中的代码完全一样。如果一个函数定义了一个局部变量x,然后调用eval(“x”),它会返回局部变量的值。如果它调用eval(“x=1”),它会改变局部变量的值。如果函数调用了eval(“var y=2;”),它声明了一个新的局部变量y,同样地,一个函数可以通过如下代码声明一个局部变量:

eval(“function f(){return x+1;}”);

如果在最顶层的代码中调用eval,当然,它会作用于全局变量和全局函数。

需要注意的是,传递给eval的字符串必须在语法上将的通,不能通过eval往函数中任意粘贴代码片段,比如:eval(“return ;”)是没有意义的,因为return只有在函数中才起到作用,并且事实上,eval的字符串执行时的上下文环境和调用函数的上下文环境是一样的,这不能使其作为函数的一部分来运行。如果字符串作为一个单独的脚本是有语义的,那么将其传递给eval作参数是完全没有问题的,否则,eval会抛出语法错误异常。

三、全局eval()

eval()具有更改布局变量的能力,这对于JavaScript优化器来说是一个很大的问题。然而作为一种权宜之计,JavaScript解释器针对那些调用了eval的函数所做的优化并不多。但当脚本定义了eval的一个别名,且用另一个名称调用它,JavaScript解释器又会如何工作呢?为了让JavaScript解释器的实现更加简化,ECMAScript3标准规定了任何解释器都不允许对eval赋予别名。如果eval函数通过别名调用的话,则会抛出一个EavlError异常。

实际上,大多数的实现并不是这么做的。当通过别名调用时,eval会将其字符串当成顶层的全局代码来执行。执行的代码可能会定义新的全局变量和全局函数,或者给全局变量赋值,但却不能使用或者修改主调函数中的局部变量,因此,这不会影响到函数内的代码优化。

ECMAScript5是反对使用EavlError的,并且规范了eval的行为,“直接的eval”,当直接使用非限定的“eval”名称来调用eval()函数时,通常称为“直接eval”。直接调用eval()时,它总是在调用它的上下文作用域内执行。其他的间接调用则使用全局对象作为其上下文作用域,并且无法读、写、定义局部变量和函数。下面有一段示例代码:

全局的eval的这些行为不仅仅是处于代码优化其的需要而作出的一种折中方案,它实际上是一种非常有用的特性,它允许我们执行那些对上下文没有任何依赖的全局脚本代码段。真正需要eval来执行代码段的场景并不多见。但当你真的意识到它的必要性的时候,你更可能会使用全局eval而不是局部eval。

四、严格eval()

ECMAScript5严格模式对eval()函数的行为施加了更多的限制,甚至对标识符eval的使用也施加了限制。当在严格模式下调用eval时,或者eval执行的代码段以“Use strict” 指令开始,这里的eval是私有上下文环境中的局部eval。也就是说,在严格模式下,eval执行的代码段可以查询或更改局部变量,但不能在局部作用域中定义新的变量或函数。

此外,严格模式将“eval”列为保留字,这让eval()更像一个运算符。不能用一个别名覆盖eval()函数。并且变量名,函数名。函数参数或者异常捕获的参数都不能取名为eval。

宝剑锋从磨砺出,梅花香自苦寒来。

推荐整理分享JavaScript中的eval()函数详解(JavaScript中的NaN代表什么),希望有所帮助,仅作参考,欢迎阅读内容。

JavaScript中的eval()函数详解(JavaScript中的NaN代表什么)

文章相关热门搜索词:JavaScript中的数据类型分为两大类,javascript中的eval函数 script标签,JavaScript中的方法名不区分大小写,JavaScript中的方法名不区分大小写,javascript中的eval函数描述,JavaScript中的NaN代表什么,javascript中的eval函数,javascript中的eval函数 script标签,内容如对您有帮助,希望把文章链接给更多的朋友!

JAVASCRIPT函数作用域和提前声明 分享 一些语言如C、java都有块级作用域,即花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,但是javascript没有块

关于JS中的闭包浅谈 (⊙o⊙)!!!这个也太尼玛官方了撒,作为菜鸟的我根本无法理解它想表达个什么意思!但是作为一只好奇的菜鸟又很想知道闭包到底是个什么东西!

JavaScript语言核心数据类型和变量使用介绍 任何的编程语言都有自己的语言核心,和众多编程语言一样,JavaScript也有自己语言的核心。语言的核心部分一般被称之为JavaScript最为基础的部分。正所

标签: JavaScript中的NaN代表什么

本文链接地址:https://www.jiuchutong.com/biancheng/376140.html 转载请保留说明!

上一篇:JavaScript 中的日期和时间及表示标准介绍(js中日期格式转换)

下一篇:JAVASCRIPT函数作用域和提前声明 分享(javascript编写函数)

  • 增值税发票如何开
  • 增值税出口退税款缴纳企业所得税吗
  • 新成立的公司企业所得税怎么申报
  • 100%直接控制的母子公司间划转股权或资产
  • 金税盘显示已到锁死期,未到汇总期是什么原因
  • 保理利息计算公式
  • 委托开发的定义
  • 建筑企业购进免税苗木1000元
  • 银行承兑汇票背书可以拆分
  • 公司买的车怎么做分录
  • 投资性房地产计量模式的转换
  • 资产的名义已使用年限与实际已使用年限的区别与联系
  • 溢价发行股票的账务处理
  • 对供应商罚款通知单怎么写
  • 虚开发票走账对方不返还如何处理?
  • 小型微利企业享受企业所得税减免优惠时主要留存备查
  • 未收到发票可以计提成本吗
  • 长期租赁存在的主要原因为什么是节税
  • 电费先付后开票怎么做账
  • 出口货物 关税
  • 银行转账备用金是什么意思
  • 承兑汇票背书用什么方法?
  • 工资退税手续需要多久
  • 资产负债表资产总额在哪
  • 兼职劳务费个税怎么算
  • 营改增建筑工程怎么计算举例
  • 企业公示啥意思
  • 开启浏览器模式
  • 应收账款无法收回确认为坏账会计分录
  • 给员工买饮料
  • 企业分配利润的原则
  • 鸿蒙怎么装app
  • 如何计算经营性负债
  • 退回的企业所得税怎么做账
  • Fort Rock Valley Historical Homestead博物馆,俄勒冈 (© Prisma by Dukas Presseagentur GmbH/Alamy)
  • 无偿转让股权如何做账
  • yolov2训练
  • 以权益结算的股票
  • 变电所的相关费用是什么
  • 备发工资的会计科目
  • yolov5画框重复、大框包小框问题解决,c++、python代码调用onnx
  • 现代服务包括哪些税目
  • 股东股权转让是什么意思
  • 代收通行费不征消费税
  • 研发费用计入营业利润吗
  • 对公账户的种类有几种
  • 如何计提增值税销项税额
  • python tkinter ttk
  • 保函被索赔支付什么意思
  • 计提坏账准备方法变更属于会计估计变更吗
  • 个人独资企业一般纳税人享受六税两费
  • 业务招待费汇算清缴填哪个表
  • 收到的货款比实际货款多
  • 个人社保和公积金
  • 公司有美金账户如何做账
  • 递延收入怎么做账
  • 退回现金会计分录
  • 存货毁损损失应计入的科目是
  • SQL order by ID desc/asc加一个排序的字段解决查询慢问题
  • 下载windows vista
  • wmiprvse.exe这是什么进程
  • win8中文版是什么版本
  • 删除windows.edb
  • win7和vista的区别
  • centos wget
  • kenmail.exe进程有什么用 是什么进程 kenmail进程查询
  • 微软刷机怎么刷
  • 简单阐述javascript的主要作用
  • jframe背景透明
  • 安卓匿名电话软件
  • linux4个主要部分
  • node.js详解
  • web应用程序开源框架
  • jquery事件的响应
  • unity投影交互开发
  • python读取linux文件
  • 无锡医疗保险缴费比例
  • 农业方面有哪些专业
  • 年度汇算清缴计算
  • 生产企业出口退税账务处理会计分录
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设