转发请标明来源:http://www.cnblogs.com/johnhou/p/javascript.html  请尊重笔者的劳动成果  --John Hou

在javascript中有多种方法可以让一段字符串当做一段js代码来执行:

  1. 使用eval("要执行的字符串")
  2. 使用new Function("要执行的字符串")
  3. setTimeOut("要执行的字符串",500)
  4. setInterval("要执行的字符串",500)

当然根据javascript最佳实践,我们是不推荐上面的任何一种方式的,当然eval()在处理JSON串时还是必须使用的,但是最佳实践禁止使用new Function构造函数来创建函数,而且禁止给setTimeout()和setInterval()方法传递字符串,应该传递函数名。

一、eval和new Function()的区别:

console.log("执行Function");

var val = new Function("console.log('houquan')");

console.log(typeof val);

console.log(val);

val();//如果不调用,那么就永远也不会输出“houquan”

/**

通过new Function("...")执行返回的结果是一个名为anonymous的函数,函数体就是传到new Function()中的字符串。

anonymous的中卫意思是:匿名的

*/

val = new Function("(function(){console.log('test');})()");

console.log(typeof val);

console.log(val);

val();

new Function("alert('test1')");

eval("alert('test2')");

/**

new Function()和eval()的区别是,前者把传入的字符串封装为一个function对象

的语句返回,直到调用这个返回的函数时,才会执行字符串所要执行的操作;后者则是

直接把字符串当做js代码执行,返回的结果是一个Object对象。

*/

console.log("执行eval");

val = eval("console.log('houding')");

console.log(typeof val);

console.log(val);

/**

eval的执行结果在FireFox下是一个对象,在IE8中不返回结果

该对象在FireFox中的结构如下:

*/

执行结果:

FireFox下的执行结果

IE8下的执行结果:

二、使用eval的注意事项:

console.log("第一个执行");

try{

eval("function(){console.log('error');}");

}catch(e){

console.log("error1");

console.log(e.toString());

}

/**上面代码执行的结果就类似于在全局作用域中定义一个匿名函数是一个道理,

果断报错,这就相当于给全局对象window,添加一个匿名的属性,或者方法一

样,显然是无法做到的!

*/

console.log("第二个执行");

try{

eval("(function(){console.log('right')})()");

}catch(e){

console.log("error2");

console.log(e.toString());

}

/**

上面的代码就相当于执行一个即时函数一样

*/

console.log("第三个执行");

try{

eval("function test(){console.log('test');}");

test();

}catch(e){

console.log("error3");

console.log(e.toString());

}

/**

上面的代码相当于定义一个函数

*/

执行结果:

eval 执行创建对象字面量注意事项

console.log("错误的创建对象字面量的情况");

try{

eval("{name:'houquan'}");

}catch(e){

console.log("error");

console.log(e.toString());

}

/**

上面的代码等同于下面的代码

*/

name:"houquan";

console.log("正确的创建对象字面量的情况");

try{

eval("({name:'houquna'})");

}catch(e){

console.log("error0");

console.log(e.toString());

}

/**

上面第一段代码中javascript引擎把{}中档次代码块来执行,所以不会返回

预期的对象

应该把对象字面量的创建语句用()括起来,当成一个表达式来执行,这样

就能得到正确的结果了。

*/

执行结果:

单独执行

try{

eval("{name:'houquan'}");

}catch(e){

console.log("error");

console.log(e.toString());

}

执行结果:

以下是我的微信公众号,技术大牛集结号,欢迎您的关注!

给我足够的时间,我能模拟整个世界!

javascript系列1--把字符串当代码来执行的更多相关文章

  1. 深入理解JavaScript系列(46):代码复用模式(推荐篇)

    介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用. 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { fun ...

  2. 深入理解JavaScript系列(45):代码复用模式(避免篇)

    介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量 ...

  3. 研磨JavaScript系列(四):代码的时空

    对于过程式编程来说,代码执行的时间与数据标识的空间是密不可分的.我们只有把指令执行的具体时刻与标识映射的具体地址结合起来,才能确定程序在执行瞬间的上下文状态.于是,代码时刻与数据标识的结构,就形成了作 ...

  4. 深入理解JavaScript系列

    转自http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 深入理解JavaScript系列(1):编写高质量JavaScript代码 ...

  5. 深入理解JavaScript系列(转自汤姆大叔)

    深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...

  6. [转]深入理解JavaScript系列

    文章转自:汤姆大叔-深入理解JavaScript系列文章 深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解Ja ...

  7. [转载]深入理解JavaScript系列 --汤姆大叔

    深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...

  8. 深入理解JavaScript系列(转载)

    深入理解JavaScript系列 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaSc ...

  9. 研磨JavaScript系列

    JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言.同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作.它最初由网景公司 ...

随机推荐

  1. Linux - 动态(Dynamic)与静态(Static)函数库

    首先我们要知道的是,函式库的类型有哪些?依据函式库被使用的类型而分为两大类,分别是静态 (Static) 与动态 (Dynamic) 函式库两类. 静态函式库的特色: 扩展名:(扩展名为 .a)   ...

  2. ubuntu安装qq教程

    安装策略是wine+wine QQ TM2013,wine QQ TM2013是一款专门为wine进行优化的版本 我的ubuntu系统是14.04版本,64位 1. sudo apt-get inst ...

  3. Ajax 模糊查询的简单实现

    类似于百度的搜索引擎模糊查询功能,不过百度的模糊查询功能更强大,这里简单实现下. 要实现模糊查询,首先要做的就是把SQL写好.话不多少,直接贴代码了! JSP页面: <%@ page langu ...

  4. ip地址扫描

    自己写的一个ip地址扫描脚本,功能是输入ip地址和掩码,通过ping检测整个网段的ip地址,输出ping的结果. 主要的几个函数如下: 1.ip地址转化为数值,方便计算 ip2num() { ip=$ ...

  5. c# 获取TFS结构 文件

    #region 获取最新版本 /// <summary> /// 获取最新版本 /// </summary> /// <param name="server_u ...

  6. CSDN的博客搜索功能不又给力了呵呵呵呵

    不得不说,CSDN博客的搜索功能是在太弱了.而且一直都很弱,以至于我每次想在自己博客上找自己发的文章都变得那么难.做一个搜索博客内文章的功能没有那么难吧? 还是说CSDN已经放弃了博客这一块了? 我发 ...

  7. ORACLE数据库维护

    ORACLE数据库维护(转)----一篇关于oracle的不错的文章 1. ORACLE数据库启动与关闭   1.1 打开和关闭数据库 (手工)1.1.1 sqlplus连接   1.1.2 打开数据 ...

  8. 关于mysql保存数据的时候报问题分析  普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战、避免 emoji 表情符号带来的问题、涉及无线相关的 MySQL 数据库建议都提前采用 utstring value:'\xF0\x9F\x98\x82\xF0\x9F...' for ...

    问题分析 普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战.避免 emoji 表情符号带来的问题 ...

  9. Day10 多线程理论 开启线程

    多线程: 多线程和多进程的不同是他们占用的资源不一样, 一个进程里边可以包含一个或多个进程, 进程的开销大,线程的开销小. 打个比方来说:创建一个进程,就是创建一个车间.创建一个线程,就是在一个车间创 ...

  10. 畅通工程-HZNU寒假集训

    畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只 ...