javascript--把字符串当代码来执行

在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());

}

执行结果:

时间: 2024-10-29 10:47:52

javascript--把字符串当代码来执行的相关文章

Javascript位置 body之前、后执行顺序(探讨)!

转载来自:http://blog.csdn.net/dxnn520/article/details/7927461 简介:当页面加载的时候,嵌入html标记的js代码和位于<body></body>之间的js代码将被执行:当调用的时候,位于<head></head>之间代码和外部js文件代码将被执行 1.根据实际需要放置代码? 有时候,您实际上需要把代码放置在不同地方以符合代码运行要求.比如,您需要在代码全部载入浏览器后再运行代码,那就可以将<scri

JQuery html API支持解析执行Javascript脚本功能实现-代码分析

JQuery html用法(功能类似innerHTML) 开发中需要使用Ajax技术来更新页面局部区域, 使用的方法是ajax获取html代码段(字符串),然后将这个html代码段作为参数,传入目标DOM(JQuery对象)的JQuery html接口,此语句执行后, 会将html代码段解释执行, 显示出html代码段描述的页面控件. 例如: <html> <head> <script type="text/javascript" src="./

JavaScript代码不执行

一天先后有两个同事问我为啥他的js代码出现了莫名其妙的问题 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-

Matlab - 将字符串作为代码执行

使用eval()函数将字符串作为代码执行: 配合num2str()函数和循环结构,可访问按规律排列的文件. >> help eval eval Execute MATLAB expression in text. % eval 将字符作为MATLAB代码执行: eval(EXPRESSION) evaluates the MATLAB code in the character vector EXPRESSION. [OUTPUT1,...,OUTPUTN] = eval(EXPRESSION

javascript代码解释执行过程

javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期 下面的几个demo解释了js解释器对变量和代码的解释过程 //#demo1 foo();//alert(1) function foo(){//声明式函数 alert(1); } foo2();//undefined is not a function var foo2 = function(){//赋值式函数声明,其

如何实现 javascript “同步”调用 app 代码

在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论).为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些情况下,我们可能更需要同步接口.同步接口的好处在于,首先 js 可以通过返回值得到执行结果:其次,在混合式开发中,app 层导出的某些 api 按照语义就应该是同步的,否则会很奇怪——一个可能在 for 循环中使用的,执行非常快的接口,比如读写某个配置项,设计成异步会很奇怪. 那么如何向 js 层导

javascript中字符串和数组的相互转换

javascript中字符串和数组的相互转换:字符串和数组的相互转换操作是非常的重要的,因为在实际编码过程中会经常用到,所以这是必须要掌握的知识点,当然这个知识点并不难,知道了就永远知道了,并不是那种需要充分实践才能够掌握的东西,下面就做一下简单的介绍.一.字符串转换为数组:此操作会用到split()函数,它能够以指定的字符作为分隔符,将字符串转换成一个数组,实例代码如下: var Str="abc-mng-zhang-mayi"; var newArray=Str.split(&qu

JavaScript代码优化(下载时间和执行速度优化)

JavaScript代码的速度被分成两部分:下载时间和执行速度. 下载时间 Web浏览器下载的是js源码,因此所有长变量名和注释都回包含在内.这个因素会增加下载时间.1160是一个TCP-IP包中的字节数.最好能将每个javascript文件都保持在1160字节以下以获得最优的下载时间.    由于这个原因,要删除注释.删除制表符和空格.删除所有的换行.将长变量名缩短. 遵循这4条比较困难.因此用外部程序(ECMAScript Cruncher)来帮助我们. 要运行ESC,必使用Windows系

javascript类型系统——字符串String类型

× 目录 [1]定义 [2]引号 [3]反斜线[4]特点[5]转字符串[6]长度属性[7]实例方法 前面的话 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串String是javascript基本数据类型,同时javascript也支持String对象,它是一个原始值的包装对象.在需要时,javascript会自动在原始形式和对象形式之间转换.本文将介绍字符串String原始类型及String包装对象 定义 字符串String类