来源:http://wanyij.blog.51cto.com/46570/43794

发现为本文起一个合适的标题还不是那么容易,呵呵,所以在此先说明下本文的两个目的:
(1)介绍javascript中的eval函数的用法
(2)如何在函数内执行全局代码

►先来说eval的用法,内容比较简单,熟悉的可以跳过。
eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。
需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下:
var code1='"a" + 2';    //表达式
var code2='{a:2}';      //语句
alert(eval(code1));     //->'a2'
alert(eval(code2));     //->undefined
alert(eval('(' + code2 + ')'));    //->[object Object]
可以看到,对于对象声明语句来说,仅仅是执行,并不能返回值。为了返回常用的“{}”这样的对象声明语句,必须用括号括住,以将其转换为表达式,才能返回其值。这也是使用JSON来进行Ajax开发的基本原理之一。在例子中可以清楚的看到,第二个alert语句输出的是undefined,而第三个加了括号后输出的是语句表示的对象。
►现在来说本文的重点,如何在函数内执行全局代码。为了说明这个问题,先看一个例子:
var s='global';    //定义一个全局变量
function demo1(){
    eval('var s="local"');
}
demo1();
alert(s);    //->global
很好理解,上面的demo1函数等价于:function demo1(){var s='local';},其中定义了一个局部变量s。
        所以最后的输出是global并不是什么奇怪的事情,毕竟大家都能很清楚的区分局部变量和全局变量。
        仔细体会一下,可以发现eval函数的特点,它总是在调用它的上下文变量空间(也称为:包,closure)内执行,无论是变量定义还是函数定义都是如此,所以如下的代码会产生函数未定义的错误:
var s='function test(){return 1;}';     //一个函数定义语句
function demo2(){
    eval(s);
}
demo2();
alert(test());    //->error:test is not defined
这是因为test函数在局部空间定义,demo2函数内可以访问到,外面就访问不到了。

         而在实际的Ajax开发中,有时我们需要从服务器动态获取代码来执行,以减轻一次载入代码过多的问题,或者是一些代码是通过Javascript自身生成的,希望用eval函数来使其执行。
但这样的动态获取代码的工作一般在函数内完成,比如:
function loadCode(){
    var code=getCode();
    eval(code);
}
可见eval不可能在全局空间内执行,这就给开发带来了不少问题,也看到过很多人为此郁闷。
不过现在偶终于找到了解决办法,嘿嘿,可以同时兼容IE和Firefox,方法如下:
var X2={}    //my namespace:)
X2.Eval=function(code){
 if(!!(window.attachEvent && !window.opera)){
  //ie
  execScript(code); 
 }else{
  //not ie
  window.eval(code);
 }
}
现在如果要想在函数内定义全局代码,就可以通过调用X2.Eval(code)方法,一个例子如下:
var s='global';
function demo3(){
 X2.Eval('var s="local"');
}
demo3();
alert(s); //->'local'
可见,在demo3函数内重新定义了全局变量s="local"。
        需要注意的是X2.Eval并不返回值,如果要进行表达式的求值,还是用系统的eval函数。X2.Eval设计为仅做全局代码定义用。
其实看到这里,或许有人感觉问题也太容易解决了点,呵呵,但发现这个办法倒是需要些运气和技巧的:
(1)对于IE浏览器,默认已经提供了这样的函数:execScript,用于在全局空间执行代码,只是知道的人还不多。
(2)对于Firefox浏览器,直接调用eval函数,则在调用者的空间执行;如果调用       window.eval则在全局空间执行。这个知道的人估计就更少了。毕竟alert(eval==window.eval)返回true!
Firefox的eval函数的特点的确是很令人奇怪的,但从javascript规范中倒也能找到其来源:
If value of the eval property is used in any way other than a direct call (that is, other than by the explicit use of its
name as an Identifier which is the MemberExpression in a CallExpression), or if the eval property is assigned to,
an EvalError exception may be thrown.
意思大概就是说eval函数的执行是和调用者相关的,但并没有说其执行上下文的问题。所以IE和Firefox孰是孰非也就很难说了,大家知道解决办法就好。
原文地址:[url]http://www.x2blog.cn/supnate/#sid.1735/page.1/[/url]

深入认识javascript中的eval函数相关推荐

  1. 关于js中的eval函数

    关于JS中的eval()函数 eval()函数的定义和用法 JavaScript中的 eval() 函数可以计算eval中的参数(JavaScript 字符串),并把它作为脚本代码来执行.       ...

  2. java 动态字符串_Java动态编译执行一串字符串,类似于Javascript里的eval函数

    Javascript里的eval函数能动态执行一串js脚本. 那Java里怎么做到呢. 有两种方法: 一种是使用可以执行js脚本的Java类 ScriptEngineManagerpublic sta ...

  3. JavaScript中的工厂函数vs构造函数vs class

    原文链接:JavaScript Factory Functions vs Constructor Functions vs Classes 作者:Eric Elliott 译者:sunny 转载需提前 ...

  4. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  5. 关于javascript中的回调函数

    关于javascript中的回调函数 原文地址:http://blog.csdn.net/sicluoyi/article/details/1737969 考虑一个这样的例子: 假如某个项目的底层和高 ...

  6. JavaScript中语句与函数的执行辨析

    文章出自个人博客https://knightyun.github.io/2018/05/23/js-anonymous-function,转载请申明. Javascript代码中,语句和函数以及匿名函 ...

  7. 如何找到JavaScript中的调用者函数?

    function main() {Hello(); }function Hello() {// How do you find out the caller function is 'main'? } ...

  8. jQuery中的read 和JavaScript中 的onload函数的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在JavaScript中,onload函数是最经常用到的,这个函数的作用是等待网页完全加载之后再去执行代码块中的语句,因为按照 ...

  9. 在javascript中使用纯函数处理副作用

    在javascript中使用纯函数处理副作用 今天给大家带来一片译文, 详情请点击这里.可能在墙内哦 开始了, 如果你点开这篇文章, 就证明你已经开始涉及函数式编程了, 这距离你知道纯函数的概念不会很 ...

最新文章

  1. 年薪达60万!11位院士领衔,这座举全省之力打造的科研平台诚聘博士英才
  2. linux 中关于网络的配置方法
  3. Linux Shell 命令--grep
  4. 江苏省计算机学会科学技术奖,孙国梓
  5. saturate_cast<uchar>(int v)的作用
  6. Web前端开发薪资待遇及发展前景解读
  7. 转载:tensorflow保存训练后的模型
  8. python中的构造函数_python构造函数init实例方法解析
  9. leetcode刷题:求容器中能乘最大多少水
  10. Linux学习—编译
  11. 用vuejs如何实现ajax,vuejs使用FormData实现ajax上传图片文件
  12. 安卓手机使用远程软件TeamViewer
  13. webpack 代码压缩优化篇
  14. codeup 1006
  15. 强化学习实战-使用Q-learning算法解决悬崖问题
  16. 云计算ACP弹性计算服务(二)
  17. 数据驱动运营决策-框架与方法(下)
  18. 记WSL下MySQL安装和使用BUG
  19. 2022-2028全球2-氨基-5-甲基吡啶行业调研及趋势分析报告
  20. java强制转换用法_Java入门课|这才是Java强制类型转换的正确使用方法,你真的会用这些吗...

热门文章

  1. C#实现查找指定端口被哪个进程占用并处理进程及dos命令下操作
  2. 线程中发送消息阻塞问题解决
  3. MFC创建模态对话框和非模态对话框的方法
  4. C#中的线程(一)入门
  5. mysql怎么创建自动作业_mysql 让一个存储过程定时作业的代码
  6. python r语言培训_r语言和python学哪个
  7. python处理word文档保留格式_python 处理document文档 保留原样式
  8. lamda过滤_java 使用Lambda和filter对对象集合过滤
  9. python pymysql cursors_python pymysql cursor的问题
  10. c++ socket线程池原理_ThreadPoolExecutor线程池实现原理+源码解析