转发请标明来源: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. DB Query Analyzer 6.01 is released, SQL Execute Schedule function can be used

       DB Query Analyzer is presented by Master Gen feng, Ma from Chinese Mainland. It has English versi ...

  2. 遗传算法解决TSP问题实现以及与最小生成树的对比

    摘要: 本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作.遗传算法在计算时间和占用内存上,都远远优于最小生成树算法. 程序采用Microsoft vi ...

  3. 关于java和c++中布尔量的比较

    在c++中允许 bool 量和 int 整形常量相互转换,并且用cout<<true; 在控制台上可以输出为 1 int main(int argc, _TCHAR* argv[]) { ...

  4. 关于electron的sqlite3报错,需重新编译的问题

    你需要安装sqlite3的所有依赖项,例如vs.python等.或者简单的npm安装命令,它会安装windows下的所有依赖. npm install -g windows-build-tools 然 ...

  5. 2018国赛 - Writeup(待补充)

    10.0.0.55 Writeup Web 0x01 easyweb 解题思路 题目很脑洞 用户名admin 密码123456进去可得到flag(密码现在换了) 解题脚本 无 Reverse 0x02 ...

  6. vncdotool - A command line VNC client

    作者:Daly 出处:http://www.cnblogs.com/daly 欢迎转载,也请保留这段声明.谢谢! 之前的一个项目需要需求希望可以通过命令行去远程执行一些Windows 系统操作. 所以 ...

  7. 学习jQuery必须知道的几种常用方法

    jQuery事件处理 ready(fn) 代码: $(document).ready(function(){  // Your code here...}): 作用:它可以极大地提高web应用程序的响 ...

  8. java并发包分析之———AQS框架

    一.什么是同步器   多线程并发的执行,之间通过某种 共享 状态来同步,只有当状态满足 xxxx 条件,才能触发线程执行 xxxx . 这个共同的语义可以称之为同步器.可以认为以上所有的锁机制都可以基 ...

  9. Day6_time模块

    TIME模块: print(time.time()) #指的是从1970年到现在的秒数 print(time.strftime('%Y-%m-%d %X'))  #指定特定的格式输出时间 print( ...

  10. 源码安装xadmin及使用

    xadmin是django的第三方后台 我们也可以使用pip来安装,但是推荐使用源码安装. 因为有些新功能以及发布在GitHub上,但是还未发布到pypi上,我们就可以提取使用这些功能. 一.安装 1 ...