javascript中的eval是一个非常灵活,但是灵活是伴随着风险的.
一.下面我们来看看那使用eval声明变量的问题.

    function test(x){
eval("var a=x;");
return a;
}
alert(test("hello"));

这个代码看起来还是比较简易的.

        var q="全局的";
function test(x){
eval(x);
return q;
}
alert(test("var q='局部的';"));//局部的
alert(test("var z='局部的';"));//全部的

这段代码很脆弱,也不安全.因为它赋予了外部调用者能改变test函数内部作用域.
保证eval函数不影响外部作用域的一个简单方法是在一个明确的嵌套作用域中运行它.

  var q="全局的";
function test(x){
(function(){eval(x);})();
return q;
}
alert(test("var q='局部的';"));//局部的
alert(test("var z='局部的';"));//全部的

二.eval的直接调用和间接调用

//这是直接调用
var g="全局的";
function test(){
var x="局部的";
return eval("x");
}
alert(test());//局部的
 //这是间接调用
var g="全局的";
function test(){
var x="局部的";
var f=eval;
return f("x");
}
alert(test());

不提倡这种做法.<<Effective Javascript>>上有这种说法.但是在浏览器上测试的话,就是不通过.会出现报错现象.

  /*
一种奇葩的eval间接调用方式.
*/
var g="全局的";
function test(){
var x="局部的";
return (0,eval)("x");//是不是很奇葩的调用
}
//alert(test());//局部的

(0,eval)("x");是如何工作的呢?
数字0被求值但其值被忽略了,括号说执行的结果是eval函数.因此,(0,eval)的行为几乎与简单的eval函数表示完全一致.
单子这种间接的调用eval函数的方式性能更加好,速度更加的快.

javascript中 关于eval的那些事的更多相关文章

  1. javascript 中函数eval()

    eval()函数可以把一个字符串当作一个JavaScript表达式一样去执行它. 我们常常在Javascript中间到Eval这个函数, 有些人觉得这个函数很奇怪,可以把一些字符串变的功能很强大 在我 ...

  2. JavaScript中的eval()函数

    和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作. eval(“1+2” ...

  3. JavaScript中的eval()函数详解

    和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作     eval(“1 ...

  4. 关于javascript中this的那点事

    this可谓是JavaScript中的开发神器,使用得当的话不仅有事半功倍的效果,而且代码的逼格也更高.但是既然是神器,如果你没有足够的功力的话,那么就不要使用它,否则就有可能自毁身亡.曾几何时,我偶 ...

  5. js学习笔记----JavaScript中DOM扩展的那些事

    什么都不说,先上总结的图~   Selectors API(选择符API) querySelector()方法 接收一个css选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null ...

  6. javascript中的eval函数

    eval()只有一个参数,如果传入的参数不是字符串,则直接返回这个参数.否则会将字符串当成js代码进行编译,如果编译失败则抛出语法错误(SyntaxError)异常.如果编译成功则开始执行这段代码,并 ...

  7. JavaScript中使用eval()方法解析json串

    最近在js用到了eval()方法,在这里做个笔记 当时是这么用的:data = eval("("+data+")"); data为后台向前台传送的一个json串 ...

  8. javascript中的eval()函数应用以及要点

    eval是干嘛用的?eval是直接将一段字符串作为参数,交给JS引擎预编译器进行动态分析并执行代码.如下: //调试台输出,你可以理解为console.log,再不理解就理解成alert也没事 var ...

  9. JavaScript中原型链的那些事

    引言 在面向对象的语言中继承是非常重要的概念,许多面向对象语言都支持两种继承方式:接口继承和实现继承.接口继承制只继承方法签名,而实现继承继承实际的方法.在ECMAScript中函数没有签名,所以EC ...

随机推荐

  1. POJ 1142 Smith Numbers(分治法+质因数分解)

    http://poj.org/problem?id=1142 题意: 给出一个数n,求大于n的最小数,它满足各位数相加等于该数分解质因数的各位相加. 思路:直接暴力. #include <ios ...

  2. hashmap实现及哈希冲突

    原文: https://www.cnblogs.com/peizhe123/p/5790252.html HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置.当程序执行 map. ...

  3. Android -- service的开启方式, start开启和绑定开启服务,调用服务的的方法, aidl调用远程服务

    1. 概述 bindService() 绑定服务  可以得到服务的代理人对象,间接调用服务里面的方法. 绑定服务: 间接调用服务里面的方法.           如果调用者activity被销毁了, ...

  4. 一年25个里程碑!免疫疗法“战胜”癌症,靠的是实力(5篇Science、6篇Nature )--转载

    近几年,免疫疗法的成功使癌症治疗进入了新的时代.无论是科研界,还是商业界,都丝毫没有掩饰对这一领域的热情.2016年,Cell杂志公布的年度十大最佳论文中,免疫疗法占两席.事实上,这两项成果只是去年癌 ...

  5. 数据库使用B+树原理

    转载:http://zhuanlan.51cto.com/art/201808/582078.htm https://www.cnblogs.com/vincently/p/4526560.html( ...

  6. SpringMvc中@ModelAttribute注解的使用

    一.绑定请求参数到指定对象 public String test1(@ModelAttribute("user") UserModel user) 只是此处多了一个注解@Model ...

  7. 平衡二叉树,AVL树之代码篇

    看完了第一篇博客,相信大家对于平衡二叉树的插入调整以及删除调整已经有了一定的了解,下面,我们开始介绍代码部分. 首先,再次提一下使用的结构定义 typedef char KeyType; //关键字 ...

  8. 【解决】Android 2.x 不支持overflow、position:fixed解决方案【转】

    Android 2.x和IOS5以下都不支持overflow:auto属性(position:fixed也不支持). 移动端浏览器兼容性和PC端相比,有过之而无不及.操作系统版本及各式浏览器和各式的屏 ...

  9. Virtualbox安装Windows 8.1遇到0x000000C4错误解决办法 - 转

    想要尝试一下 Windows 8.1 系统,又不愿意在电脑上直接安装,虚拟机提供了很好的平台.因为平时工作需要,其实电脑上装的虚拟机还是不少的,每天都要开着几个虚拟机一起用.多一个不多,于是尝试在自己 ...

  10. 错误 1 类,结构或接口成员声明中的标记"="无效

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...