了解一点js的Eval函数
- 格式:doc
- 大小:19.50 KB
- 文档页数:3
JavaScript中的eval函数1. eval函数有什么⽤?调⽤eval函数,可以将其参数作为JavaScript程序进⾏解释。
换句话说,eval可以把它的参数当做代码来执⾏。
例⼦function f(x) {eval('var y=x');console.log('y:', y);}f('hello');//y:hello在这个例⼦中,eval将它的string参数var y=x作为⼀⾏代码执⾏了,在函数f内部声明了⼀个局部变量y。
这和function f(x) {var y=x;console.log('y:', y);}f('hello');//y:hello的执⾏效果基本相同。
2. 避免使⽤eval函数创建局部变量允许eval函数⼲扰作⽤域,是⼀个相当错误的做法。
这种做法会使⼀段代码变得难以理解,并且不再安全。
下⾯这个例⼦便赋予了外部调⽤者修改局部变量,改变局部作⽤域的能⼒。
例⼦let g = '全局变量'function f(src) {eval(src);console.log('g:', g);}//以上为源代码f("var g= '局部变量'");//g:局部变量f("var y= '局部变量'");//g:全局变量当我们将没有在源代码中定义的变量y传⼊eval函数时,这段代码执⾏的结果将变得难以预测。
保证eval函数不影响外部作⽤域的⼀个简单⽅法是使⽤嵌套的作⽤域。
ES5的严格模式便是这样做的。
例⼦let g = '全局变量'function f(src) {(()=> eval(src))();//在嵌套作⽤域中执⾏evalconsole.log('g:', g);}//以上为源代码f("var g= '局部变量'");//g:全局变量f("var y= '局部变量'");//g:全局变量3. eval函数的两种调⽤⽅式3.1 直接调⽤⽅式:当函数调⽤涉及eval标识符时,可以称为直接调⽤。
JavaScript中的eval()函数详解和其他很多解释性语⾔⼀样,JavaScript同样可以解释运⾏由JavaScript源代码组成的字符串,并产⽣⼀个值。
JavaScript通过全局函数eval()来完成这个⼯作eval(“1+2”),-> 3动态判断源代码中的字符串是⼀种很强⼤的语⾔特性,⼏乎没有必要在实际中应⽤。
如果你使⽤了eval(),你应当仔细考虑是否真的需要使⽤它。
⼀、eval()是⼀个函数还是⼀个运算符eval()是⼀个函数,但由于它已经被当成运算符来对待了。
JavaScript语⾔的早期版本定义了eval函数,现代JavaScript解释器进⾏了⼤量的代码分析和优化。
⽽eval的问题在于,⽤于动态执⾏的代码通常来讲不能分析,换句话说,如果⼀个函数调⽤了eval,那么解释器将⽆法对这个函数做进⼀步优化,⽽将eval定义为函数的另⼀个问题是,它可以被赋予其他的名字,var f=eval;那么解释器就⽆法放⼼的优化任何调⽤了f()的函数。
⽽当eval是⼀个运算符的时候,就可以避免这些问题。
⼆、eval()eval()只有⼀个参数。
如果传⼊的参数不是字符串,它直接返回这个函数。
如果参数是字符串,它会把字符串当成JavaScript代码进⾏编译,如果编译失败者抛出⼀个语法错误异常。
如果编译成功,则开始执⾏这⼀段代码,并返回字符串中的最后⼀个表达式会或语句的值,如果最后⼀个表达式或语句没有值,则最终返回undefined。
如果字符串抛出⼀个异常,这个异常将把该调⽤传递给eval()。
关于eval最重要的是,它使⽤了调⽤它的变量作⽤域环境。
也就是说,它查找变量的值和定义新变量和函数的操作和局部作⽤域中的代码完全⼀样。
如果⼀个函数定义了⼀个局部变量x,然后调⽤eval(“x”),它会返回局部变量的值。
如果它调⽤eval(“x=1”),它会改变局部变量的值。
如果函数调⽤了eval(“var y=2;”),它声明了⼀个新的局部变量y,同样地,⼀个函数可以通过如下代码声明⼀个局部变量:eval(“function f(){return x+1;}”);如果在最顶层的代码中调⽤eval,当然,它会作⽤于全局变量和全局函数。
JS中常⽤的内置函数JS内置函数不从属于任何对象,在JS语句的任何地⽅都可以直接使⽤这些函数。
JS中常⽤的内置函数如下: 1、eval(str)接收⼀个字符串形式的表达式,并试图求出表达式的值。
作为参数的表达式可以采⽤任何合法的操作符和常数。
如果参数中包含JS命令,这些命令也可以被执⾏,就像这些命令是JS程序的⼀部分⼀样。
2、parseInt(str,n)试图从⼀个字符串中提取⼀个整数。
可附加⼀个n整数实现返回n进制整数。
如果在字符串中存在除了数字、符号、⼩数点和指数符号以外的字符,就停⽌转换,返回已有的结果。
如果第⼀个字符就不能转换,函数就返回NaN值。
3、parseFloat(str)试图从⼀个字符串中提取⼀个浮点值。
如果在字符串中存在除了数字、符号、⼩数点和指数符号以外的字符,就停⽌转换并返回已有的结果。
如果第⼀个字符就不能转换,函数就返回NaN值。
4、isNaN()⽤于判断是否为NaN值类型,如果是函数返回true。
5、isFinite(number)可以判断参数number是否是⼀个⽆穷。
如果是则函数返回false,否则返回true。
6、escape()接受⼀个字符串,这个字符串中可能含有空格、分号等字符。
函数把字符串转换成Cookie的内部表⽰⽅式。
函数返回值就是这种内部的表达⽅式。
7、unescape()接受⼀个Cookie,把其内部表达⽅式转化成普通的字符串形式。
JS函数⼀共可分为常规函数、数组函数、⽇期函数、数学函数、字符串函数等五类。
1.9个常规函数 (1)alert函数:显⽰⼀个警告对话框,包括⼀个OK按钮。
(2)confirm函数:显⽰⼀个确认对话框,包括OK、Cancel按钮。
(3)escape函数:将字符转换成Unicode码。
(4)eval函数:计算表达式的结果。
(5)isNaN函数:测试是(true)否(false)不是⼀个数字。
(6)parseFloat函数:将字符串转换成符点数字形式。
js eval用法一、什么是eval函数在JavaScript中,eval()是一个内置函数,它可以将字符串作为代码执行。
eval函数通常用于动态执行代码,将字符串转换为可执行的JavaScript代码。
二、eval函数的基本语法eval()函数的基本语法如下:eval(code)其中,code是一个字符串,代表要执行的JavaScript代码。
三、eval函数的使用场景eval函数在以下几个场景中非常有用:1. 动态执行代码eval函数最常见的用途之一是动态执行代码。
通过将代码字符串传递给eval函数,可以在运行时执行动态生成的代码。
var code = "console.log('Hello, World!');";eval(code); // 输出:Hello, World!在上面的例子中,我们将字符串"console.log('Hello, World!');"传递给eval函数,并通过eval函数执行了这段代码,最终在控制台输出了Hello, World!。
2. 解析JSON字符串eval函数还可以用于解析JSON字符串。
在没有原生JSON.parse函数的早期,eval函数是解析JSON字符串的常用方法。
var jsonString = '{"name": "John", "age": 30}';var data = eval('(' + jsonString + ')');console.log(); // 输出:Johnconsole.log(data.age); // 输出:30在上面的例子中,我们使用eval函数将JSON字符串解析为JavaScript对象。
3. 动态创建函数eval函数还可以用于动态创建函数。
eval 函数
eval 函数是 JavaScript 中的内建函数,常用于将字符串当做JavaScript代码片段
来解析,可以用来创建和执行javascript,实现可以强大的浏览器自定义性。
它可以在不把数据传递到服务器的情况下,在客户端进行 JavaScrpt 代码的解析,具有较高的运行
效率。
eval 函数原理是把字符串当作代码处理,在它的内部都会先分析字符串,然后解析它、执行它,最终把字符串解析回一个JavaScript 的值,而不是字符串本身。
使用 eval函数的方法是先把字符串传入eval函数,然后由JavaScript的内置函数
执行这个js代码,返回一个值,并且这个值会体现在eval函数的返回值当中。
另外eval 函数也会改变当前运行中的作用域,所有变量都在 eval 函数当中创建。
由于eval函数是一个内置的安全漏洞,因此在使用 eval 的时候一定要慎重,不要
将危险的字符串传递给eval,只有当eval函数的参数可控的情况下,才可以安全使用它。
js evaluate函数用法JS evaluate函数用法1. 什么是evaluate函数?Evaluate函数是JavaScript中的一个内置函数,它用于执行一段动态生成的JavaScript代码并返回结果。
简单来说,它可以在运行时执行字符串形式的JavaScript代码。
2. evaluate函数的基本语法eval(codeString)其中,codeString是一个字符串,它包含了要执行的JavaScript代码。
3. 使用evaluate函数的常见场景使用evaluate函数可以实现许多有趣的功能,下面是一些常见的用法:•动态创建函数const functionName = "myFunction";const functionCode = "('Hello World!');";eval(`function ${functionName}() { ${functionCode} }`); myFunction(); // 输出:Hello World!在上述示例中,我们动态创建了一个名为myFunction的函数,函数体中的代码是通过字符串形式传入eval函数进行执行的。
•执行JSON字符串const jsonString = '{"name": "John", "age": 30}'; const jsonObj = eval(`(${jsonString})`);(); // 输出:John通过将JSON字符串作为参数传入eval函数,我们可以将其动态转换为JavaScript对象。
•动态修改变量的值let x = 5;eval("x = 10");(x); // 输出:10通过将要执行的代码以字符串形式传入eval函数,我们可以动态修改已存在的变量的值。
javascript通过字符串调用函数的实现方法字符串调用函数是很常见的一个需求,通常情况下我们会使用eval()函数实现,但这种做法会存在一些潜在的风险,同时也不利于代码的性能。
今天我们就来探讨一下如何使用javascript通过字符串调用函数的实现方法。
1.使用eval()函数先来介绍一下eval()函数,这是一个JavaScript内建函数,能够将一个字符串解析成一个JS表达式,并执行表达式中的代码。
如:eval("alert('Hello World')");上面的代码会弹出一个对话框,显示“Hello World”这句话。
这种调用方式非常简单,但是有很大的安全风险。
如果代码中的字符串是从用户输入或者不可信来源获取的,那么用户就可以通过构造恶意代码攻击应用程序。
因此,我们应该避免使用eval()函数来调用字符串中的函数。
2.使用window对象中的方法在全局作用域下,所有的函数和变量都会作为window对象的属性和方法来进行管理。
我们可以通过window对象来调用函数。
如:window.alert('Hello World');这样就可以调用alert()函数,同样可以通过window对象调用其他的函数。
但这种调用方式需要在全局作用域下使用,而且代码可读性也不高。
因此,我们可以继续寻找更好的方法。
3.使用eval()函数的安全替代方案在ES5标准中,引入了Function对象,并支持使用Function构造函数来动态生成函数对象。
函数对象生成之后就可以使用函数名来进行调用,不需要使用eval()函数。
如下示例代码:var func = new Function("alert('Hello world!');");func();上面的代码定义了一个函数对象,然后通过函数名调用该函数。
这种方式可以避免使用eval()函数的安全风险,同样可以使用其他的函数进行动态调用。
eval在js中的用法-回复JavaScript中的eval函数在JavaScript中,eval函数是一个非常有用的函数,可以执行一个包含JavaScript代码的字符串,并返回执行结果。
它的基本语法是eval(string)。
当我们需要动态执行一段JavaScript代码时,使用eval函数可以非常方便地实现。
eval函数被广泛用于解析JSON、执行动态脚本和创建动态函数等方面。
接下来,我将详细介绍eval函数在JavaScript中的用法。
一、eval函数的基本用法eval函数的基本用法非常简单,只需要传入一个包含JavaScript代码的字符串即可。
eval函数会将这段字符串中的代码作为JavaScript代码执行,并返回执行结果。
下面是一个简单的例子,演示了eval函数的基本用法:javascriptvar x = 1;var y = 2;var code = 'console.log(x + y)';eval(code); 输出结果为3在上面的例子中,我们定义了两个变量x和y,并定义了一个包含JavaScript代码的字符串code。
然后,通过调用eval(code),就可以执行这段字符串中的JavaScript代码。
需要注意的是,eval函数执行的代码会在当前作用域中执行,并可以访问该作用域中定义的变量和函数。
因此,在上面的例子中,eval函数可以访问到x和y变量,并将它们相加的结果打印出来。
二、eval函数的安全风险尽管eval函数非常便利,但它也存在一些安全风险。
由于eval函数可以执行任意的JavaScript代码,如果被恶意使用,可能会导致安全问题。
首先,eval函数执行的代码可以访问到当前作用域中的变量和函数,包括一些敏感的信息。
如果我们在使用eval函数时不小心传入了一个恶意代码的字符串,那么恶意代码就有可能窃取到我们的敏感信息。
其次,eval函数执行的代码可以修改作用域中的变量和函数。
js 解析函数-回复"js解析函数"是指在JavaScript编程语言中用于解析和执行代码的功能。
这些函数通常用于解析和执行JavaScript代码,并将其转换为计算机可以理解和执行的形式。
在本文中,我们将一步一步地回答与js解析函数相关的问题,并提供详细的解释和示例。
第一步:了解什么是解析函数解析函数是JavaScript的一种内置函数,用于解析和执行JavaScript代码。
该函数会将代码转换为可执行的命令,以便计算机可以按照代码的指示执行。
解析函数通常在浏览器中执行,但也可以在服务器端使用。
在JavaScript中,有多种解析函数可用,包括eval()、JSON.parse()以及Function()等。
这些函数具有不同的用途和特性,可根据具体需求选择合适的函数来解析和执行代码。
第二步:了解eval()函数eval()函数是JavaScript中最常用的解析函数之一。
它接受一个字符串作为参数,并将其解析为可执行的代码。
eval()函数可以执行任何有效的JavaScript代码,包括变量声明、函数定义、条件语句和循环等。
以下是eval()函数的一些示例用法:1. 将字符串转换为变量声明和赋值:eval("var x = 5;");console.log(x); 输出:52. 执行动态生成的函数:var functionName = "sayHello";eval("function " + functionName + "() { console.log('Hello!'); }"); eval(functionName + "();"); 输出:Hello!3. 执行动态生成的条件语句:var condition = "true";eval("if (" + condition + ") { console.log('Condition is true'); }"); 输出:Condition is true请注意,eval()函数的使用需要谨慎,因为它具有执行任意代码的能力,并且容易导致安全漏洞和性能问题。
Vue中的eval函数1. 函数定义在Vue中,eval函数是JavaScript中的一个内置函数,用于将字符串作为代码进行解析和执行。
eval函数的定义如下:eval(string)其中,string是要执行的JavaScript代码的字符串形式。
2. 函数用途eval函数的主要用途是动态执行JavaScript代码。
它可以将字符串形式的代码转换为可执行的代码,并在当前作用域中执行。
eval函数可以用于以下几个方面:2.1 动态执行代码eval函数可以将字符串形式的代码转换为可执行的代码,从而动态执行代码。
这对于需要根据运行时条件来生成和执行代码的情况非常有用。
例如,可以根据用户的输入动态执行不同的代码逻辑。
2.2 动态加载模块在Vue中,可以使用eval函数动态加载模块。
通过将模块的代码字符串传递给eval函数,可以将模块的代码解析并执行,从而实现动态加载模块的功能。
这对于按需加载模块或根据条件加载不同模块的场景非常有用。
2.3 动态生成代码eval函数可以根据运行时条件动态生成代码。
通过将字符串形式的代码与变量或表达式拼接起来,可以生成不同的代码逻辑。
这对于需要根据不同情况生成不同代码的情况非常有用。
2.4 调试和测试eval函数可以用于调试和测试代码。
通过将要测试或调试的代码字符串传递给eval函数,可以在当前作用域中执行该代码,并观察其行为和输出结果。
这对于快速验证代码逻辑或调试问题非常有用。
3. 函数工作方式eval函数的工作方式可以分为以下几个步骤:3.1 解析代码字符串首先,eval函数会解析传入的代码字符串。
它将检查代码的语法是否正确,并将代码转换为可执行的语法树。
3.2 创建作用域接下来,eval函数会创建一个新的作用域,用于执行代码。
这个作用域在eval函数调用时创建,并在eval函数执行完毕后销毁。
作用域中包含了变量、函数等信息,用于代码的执行。
3.3 执行代码在创建作用域后,eval函数会执行解析后的代码。
eval()函数的特点和作⽤eval(): 作⽤:它的作⽤是把对应的字符串解析成js代码并运⾏(将json的字符串解析成为JSON对象); 特点:它是⼀个全局函数; 缺点:1>在该函数内部申明的变量都是全局变量,且申明的变量不会提升; 2>耗性能,执⾏2次,⼀次解析成js语句,⼀次执⾏js代码; 举例: 1.对于服务器返回的JSON字符串,如果jquery异步请求没做类型说明,或者以字符串⽅式接受,那么需要做⼀次对象化处理,就是将字符串放到eval()函数中执⾏如下:已知服务器返回JSON字符串集合:var data="{ student:[ {name:'⼩明',age:17}, {name:'⼩红',age:16}, {name:'⼩鹏',age:18}]}";var dataObj=eval("("+data+")");注意:这⾥在data外添加"("+**+")"是由于json是以"{}"的⽅式包裹的,js会将以"{}"包裹的代码当成语句处理,所以在调⽤该函数的时候需要先强制性转换⼀种表达⽅式,alert(eval("{}"); // return undefined;alert(eval("({})");// return object[Object];2..对于服务器返回的JSON字符串,如果jquery异步请求将type(⼀般为这个配置属性)设为“json”,或者利⽤$.getJSON()⽅法获得服务器返回,那么就不需要eval()⽅法了,因为这时候得到的结果已经是json对象了,只需直接调⽤该对象即可,这⾥以$.getJSON⽅法为例说明数据处理⽅法:alert(dataObj.root.length);//输出root的⼦对象数量$.each(dataObj.student,fucntion(idx,item){if(idx==0){return true;}//输出每个student⼦对象的名称和值alert("name:"++",age:"+item.age);})注:对于⼀般的js⽣成json对象,只需要将$.each()⽅法替换为for语句即可,其他不变。
JavaScript中Eval()函数的作⽤这⼀周感觉没什么写的,不过在研究dwz源码的时候有⼀个eval()的⽅法不是很了解,分享出来⼀起学习-->⾸先来个最简单的理解eval可以将字符串⽣成语句执⾏,和SQL的exec()类似。
eval的使⽤场合是什么呢?有时候我们预先不知道要执⾏什么语句,只有当条件和参数给时才知道执⾏什么语句,这时候eval就派上⽤场了。
举个例⼦:我们要做⼀个function(),功能是输⼊⽹页中两个个对象的名称,然后程序就将这两个对象的值联接起来输出。
function output(a,b){var tmpa,tmpb;tmpa=document.all.a.value;tmpb=document.all.b.value;document.write(tmpa+tmpb);}output('input1','input2');这样你执⾏的时候就会提⽰错误“document.all.a不是对象”以及“document.all.b不是对象”。
原来javascript把a和b当成对象名称了,怎样能让javascript把a⾥⾯的值作为对象名称呢?这时候就要⽤eval了,把代码改成这样:function output(a,b){var tmpa,tmpb;tmpa=eval("document.all."+a+".value");tmpb=eval("document.all."+b+".value");document.write(tmpa+tmpb);}output('input1','input2');这样javascript就会先取出a,b的值,然后和前⾯的document.all.以及后⾯的.value组合运⾏,于是就可以顺利取出input1和input2的值.看完上⾯的基本理解eval是什么含义了吧然后看下⾯的理解稍微晋级⼀点点,⽤到了DOM中替换图⽚的例⼦在Javascript中Eval函数的使⽤?【eval()函数】JavaScript有许多⼩窍门来使编程更加容易。
js中的eval⽅法详解(⼀)–eval⽅法的初级应⽤在我看来,js中的eval()⽅法就是⼀个js语⾔的执⾏器,它能把其中的参数按照JavaScript语法进⾏解析并执⾏。
语法:eval(s);1eval()⽅法中的参数s有多种情况。
参数的不同形式,会使eval()⽅法执⾏的结果和返回值有差别。
下⾯来说说他们的区别。
eval()⽅法的参数形式如果参数s不是字符串,⽽是整数或者是Function类型,则直接返回该整数或Function举个栗⼦例1:var x = 1;var y = eval(x);//eval()⽅法返回1var z = eval(1)//eval()⽅法返回1例2:var f = eval(function(){console.log("1111");return 1});/*eval()⽅法返回:function(){console.log("1111");return 1;}⽅法*/var s = f();//执⾏⽅法 s=1,打印⽇志"1111"/**>>>>>>>>>>>>>>>**/var ff = function(){console.log("1111");return 1;};var f = eval(ff);//eval()⽅法返回ff⽅法var s = ff();//执⾏ff⽅法 s=1,打印⽇志"1111"/**>>>>>>>>>>>>>>>**/function ff(){console.log("1111");return 1;};var f = eval(ff);//eval()⽅法返回ff⽅法var s = ff();//执⾏ff⽅法 s=1,打印⽇志"1111"如果参数s是字符串,并且字符串中是表达式,则eval()⽅法会计算字符串中的表达式,返回该表达式计算的结果。
js 函数名字符串1. JavaScript中的函数是一种可重复使用的代码块,通过函数名字符串可以方便地调用和执行特定的函数。
本文将围绕几个常见的JavaScript函数名字符串展开,探讨其具体功能和用法。
2. eval()函数eval()函数可以将字符串作为JavaScript代码进行解析和执行。
它接受一个字符串参数,并将其作为代码进行求值。
eval()函数非常灵活,可以用于动态生成代码、解析JSON字符串等多种场景。
但是,由于eval()函数的执行过程中存在潜在的安全风险,因此在使用时应谨慎,避免执行不受信任的代码。
3. parseInt()函数parseInt()函数可以将字符串转换为整数。
它接受一个字符串参数,并尝试将其解析为整数。
如果字符串以数字开头,则解析成功并返回对应的整数值;如果字符串以非数字字符开头,则解析会停止,并返回之前解析成功的整数部分。
parseInt()函数还可以接受第二个参数,用于指定解析时使用的进制数。
例如,parseInt("10", 2)会将字符串"10"解析为二进制数,并返回对应的十进制整数值2。
4. parseFloat()函数parseFloat()函数可以将字符串转换为浮点数。
它与parseInt()函数类似,但可以解析包含小数点的字符串。
parseFloat()函数会从字符串的开头开始解析,直到遇到非数字字符为止。
如果字符串以非数字字符开头,则解析会停止,并返回之前解析成功的浮点数部分。
与parseInt()函数不同,parseFloat()函数没有指定进制的参数,只能解析十进制数。
5. toString()函数toString()函数可以将其他类型的值转换为字符串。
它是JavaScript 中的内置函数,可以用于将数字、布尔值、对象等转换为对应的字符串表示。
toString()函数可以接受一个参数,用于指定转换时的进制数。
Eval函数eval的作⽤其实很简单,就是把⼀段字符串传递给JS解释器,由Javascript解释器将这段字符串解释成Javascript代码,并且执⾏他。
举个最简单的例⼦:<script type="text/javascript">eval("alert(1+1)");</script>很简单,把字符串解释成JS代码并执⾏,弹出2。
当然,上⾯的例⼦只是个玩具,在实际中没有⼈会傻到这么⽤。
我想⼤家最基本的使⽤eval函数都是应该在DOM中,例如我们有div1,div2,div3,那么在document.getElementByID时我们的ID没有办法去得到,那么最简单的办法就是在for循环中,使⽤eval来拼接这么⼀段程序。
例如这样:<script type="text/javascript">for (var loop = 1; loop < 10; loop++) {eval('document.getElementById("div"+loop).innerHTML="123"');}</script>最基本的⽤法说完,相信⼤家还是对这个函数意犹未尽,如果这个函数只有这么点⽤法,那就太⽆聊了。
那我们就⼀点点来剖下⼀下eval()函数。
我们就先从eval的作⽤域说起,先看这样⼀段函数:<script type="text/javascript">eval("var i=3");alert(i);</script>代码很简单,结果可以弹出3。
接下来再对⽐这段代码:<script type="text/javascript">var test = function () {eval("var i=3");alert(i);}test();alert(i);</script>结果是⾸先弹出3,然后是undefined。
Javascript 中eval 函数的使⽤⽅法与⽰例定义和⽤法 eval() 函数可计算某个字符串,并执⾏其中的的 JavaScript 代码。
语法 eval(string) 参数 描述 string 必需。
要计算的字符串,其中含有要计算的 JavaScript 表达式或要执⾏的语句。
返回值 通过计算 string 得到的值(如果有的话)。
说明 该⽅法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该⽅法将不作任何改变地返回。
因此请不要为 eval() 函数传递 String 对象来作为参数。
如果试图覆盖 eval 属性或把 eval() ⽅法赋予另⼀个属性,并通过该属性调⽤它,则 ECMAScript 实现允许抛出⼀个 EvalError 异常。
抛出 如果参数中没有合法的表达式和语句,则抛出 SyntaxError 异常。
如果⾮法调⽤ eval(),则抛出 EvalError 异常。
如果传递给 eval() 的 Javascript 代码⽣成了⼀个异常,eval() 将把该异常传递给调⽤者。
提⽰和注释 提⽰:虽然 eval() 的功能⾮常强⼤,但在实际使⽤中⽤到它的情况并不多。
下⾯为⼤家分享⼀个常⽤的⼩例⼦:12345678910111213<SCRIPT language="javascript">function showsubmenu(sid){whichEl = eval("submenu" + sid);if (whichEl.style.display == "none"){eval("submenu" + sid + ".style.display=\"\";");}else{eval("submenu" + sid + ".style.display=\"none\";");}}</SCRIPT>Eval 函数功能:先解释Javascript 代码,然后在执⾏它⽤法:Eval(codeString)codeString 是包含有Javascript 语句的字符串,在eval 之后使⽤Javascript 引擎编译。
之前只知道eval可以解析字符串,刚刚网上看了又了解了一点,这里贴出来,不懂的也看看哈
代码如下:
<title>无标题文档</title>
<script language="javascript" type="text/javascript">
//eval(vable)能是把对应的字符串解析成JS代码并运行即:可以把一个字符串当作一个JavaScript表达式一样去执行它。
function Eval1(){
alert("Eval1");
}
function Eval2(){
alert("Eval2");
}
function Alert(funName){
//当funName为Eval1时,通过eval函数可以执行Eval1()函数,Eval2同理
eval(funName+"()");
}
</script>
</head>
<body>
<input type="button" onclick="Alert('Eval2')" value="Alert" /> ---------将弹出Eval2
</body>
</html>
eval函数接收一个参数s,如果s不是字符串,则直接返回s。
否则执行s语句。
如果s语句执行结果是一个值,则返回此值,否则返回undefined。
需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下:
复制代码代码如下:
var code1='"a" + 2'; //表达式
varcode2='{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(){
varcode=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_r(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孰是孰非也就很难说了,大家知道解决办法就好。