javascript系列1--把字符串当代码来执行
转发请标明来源:http://www.cnblogs.com/johnhou/p/javascript.html 请尊重笔者的劳动成果 --John Hou
在javascript中有多种方法可以让一段字符串当做一段js代码来执行:
- 使用eval("要执行的字符串")
- 使用new Function("要执行的字符串")
- setTimeOut("要执行的字符串",500)
- 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--把字符串当代码来执行的更多相关文章
- 深入理解JavaScript系列(46):代码复用模式(推荐篇)
介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用. 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { fun ...
- 深入理解JavaScript系列(45):代码复用模式(避免篇)
介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量 ...
- 研磨JavaScript系列(四):代码的时空
对于过程式编程来说,代码执行的时间与数据标识的空间是密不可分的.我们只有把指令执行的具体时刻与标识映射的具体地址结合起来,才能确定程序在执行瞬间的上下文状态.于是,代码时刻与数据标识的结构,就形成了作 ...
- 深入理解JavaScript系列
转自http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 深入理解JavaScript系列(1):编写高质量JavaScript代码 ...
- 深入理解JavaScript系列(转自汤姆大叔)
深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...
- [转]深入理解JavaScript系列
文章转自:汤姆大叔-深入理解JavaScript系列文章 深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解Ja ...
- [转载]深入理解JavaScript系列 --汤姆大叔
深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...
- 深入理解JavaScript系列(转载)
深入理解JavaScript系列 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaSc ...
- 研磨JavaScript系列
JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言.同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作.它最初由网景公司 ...
随机推荐
- web报表工具FineReport常用函数的用法总结(日期和时间函数)
web报表工具FineReport常用函数的用法总结(日期和时间函数) 说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd.而且必须用英文环境下双引号(" " ...
- Mina源码阅读笔记(七)—Mina的拦截器FilterChain
Filter我们很熟悉,在Mina中,filter chain的用法也类似于Servlet的filters,这种拦截器的设计思想能够狠轻松的帮助我们实现对资源的统一处理.我们先大致连接下mina中的f ...
- C# 将PDF转为SVG的3种情况
PDF格式的文档广泛用于各种办公场所,在工作中难免会有将PDF文档转换为其他文档格式的需要.在本篇文档中,将介绍PDF转为SVG的方法.根据不同的转换需求,这里分三种情况进行讲述,即转PDF所有页为S ...
- Redis客户端ServiceStack.Redis的简单使用
在nuget中下载ServiceStack.Redis,但是运行之后会出现一个问题: Exception: "Com.JinYiWei.Cache.RedisHelper"的类型初 ...
- 深入源码解析类Route
微软官网对这个类的说明是:提供用于定义路由及获取路由相关信息的属性和方法.这个说明已经很简要的说明了这个类的作用,下面我们就从源码的角度来看看这个类的内部是如何工作的. public class Ro ...
- VS2010断点调试技巧
设置断点:在如下图中的红色圆点处设置断点,红色圆点表示已经在这行设置断点.快捷键F9. 启动调试:按F5或者点击左边红框中的按钮.右边框是开始执行(不调试)Ctrl+F5. 调试工具栏:下面是工具 ...
- 学习MQ(二)基本概念
学习MQ(二)基本概念 这次简单罗列一下MQ的基本概念,还有我对它们的理解 1.queue manager 队列管理器,这是MQ系统中最上层的一个概念.每一个queue manager都有一个侦听器, ...
- OSGI介绍
OSGI介绍 OSGI简介 OSGI (Open Service Gateway Initiative)联盟成立于1999 年,它是一个非盈利的国际组织,旨在建立一个开放的服务规范,为通过网络向设备提 ...
- Math类的方法应用
class Mortgage { public static void main(String[]args) { double P=Double.parseDouble(args[0]); doubl ...
- How to change from default to alternative Python version on Debian Linux
https://linuxconfig.org/how-to-change-from-default-to-alternative-python-version-on-debian-linux You ...