javascript中 关于eval的那些事
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的那些事的更多相关文章
- javascript 中函数eval()
eval()函数可以把一个字符串当作一个JavaScript表达式一样去执行它. 我们常常在Javascript中间到Eval这个函数, 有些人觉得这个函数很奇怪,可以把一些字符串变的功能很强大 在我 ...
- JavaScript中的eval()函数
和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作. eval(“1+2” ...
- JavaScript中的eval()函数详解
和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作 eval(“1 ...
- 关于javascript中this的那点事
this可谓是JavaScript中的开发神器,使用得当的话不仅有事半功倍的效果,而且代码的逼格也更高.但是既然是神器,如果你没有足够的功力的话,那么就不要使用它,否则就有可能自毁身亡.曾几何时,我偶 ...
- js学习笔记----JavaScript中DOM扩展的那些事
什么都不说,先上总结的图~ Selectors API(选择符API) querySelector()方法 接收一个css选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null ...
- javascript中的eval函数
eval()只有一个参数,如果传入的参数不是字符串,则直接返回这个参数.否则会将字符串当成js代码进行编译,如果编译失败则抛出语法错误(SyntaxError)异常.如果编译成功则开始执行这段代码,并 ...
- JavaScript中使用eval()方法解析json串
最近在js用到了eval()方法,在这里做个笔记 当时是这么用的:data = eval("("+data+")"); data为后台向前台传送的一个json串 ...
- javascript中的eval()函数应用以及要点
eval是干嘛用的?eval是直接将一段字符串作为参数,交给JS引擎预编译器进行动态分析并执行代码.如下: //调试台输出,你可以理解为console.log,再不理解就理解成alert也没事 var ...
- JavaScript中原型链的那些事
引言 在面向对象的语言中继承是非常重要的概念,许多面向对象语言都支持两种继承方式:接口继承和实现继承.接口继承制只继承方法签名,而实现继承继承实际的方法.在ECMAScript中函数没有签名,所以EC ...
随机推荐
- Django怎么获取get请求里面的参数
获取get请求里面参数的两种方法之三种写法一,当get网址是127.0.0.1:8000/info/?id=20&s_id=30这种类型的网址时 我们在urls的路由的urlpatterns里 ...
- vue中watch的用法
一.首先确认watch是一个对象,一定要当做对象来用 watch:{ } 对象:有键,有值. 1.键:就是你要监控的那个家伙,比如说$route,这个就是要监控路由的变化.或者是data中的某个变量. ...
- iOS开发网络篇—Socket编程
一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程 ...
- Android之shape与selector实现圆角
shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和 ...
- git 设置 代理服务器
git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:8080 git config --global h ...
- Rails 5 Test Prescriptions 第7章 double stub mock
https://relishapp.com/rspec/rspec-mocks/v/3-7/docs/basics/test-doubles 你有一个问题,如果想为程序添加一个信用卡程序用于自己挣钱. ...
- IOS-网络(JSON解析数据与XML解析数据)
一.JSON解析数据 // // VideoModel.h // IOS_0130_网络视频 // // Created by ma c on 16/1/30. // Copyright © 2016 ...
- 057——VUE中vue-router之路由参数默认值的设置
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 创芯Xilinx Microblaze 学习系列第一集
创芯Xilinx Microblaze 学习系列第一集 Xilinx ISE Design Suite 13.2 The MicroBlaze™ embedded processor soft cor ...
- 学习 Flask 扩展 Flask-RESTful
pip install Flask-RESTful Flask-RESTful扩展.首先,我们来安装上面这个扩展. from flask import Flask from flask_restful ...