javascript中 关于eval的那些事
JavaScript 关于 那些 eval
2023-09-11 14:22:25 时间
javascript中的eval是一个非常灵活,但是灵活是伴随着风险的.
一.下面我们来看看那使用eval声明变量的问题.
1 function test(x){ 2 eval("var a=x;"); 3 return a; 4 } 5 alert(test("hello"));
这个代码看起来还是比较简易的.
1 var q="全局的"; 2 function test(x){ 3 eval(x); 4 return q; 5 } 6 alert(test("var q='局部的';"));//局部的 7 alert(test("var z='局部的';"));//全部的
这段代码很脆弱,也不安全.因为它赋予了外部调用者能改变test函数内部作用域.
保证eval函数不影响外部作用域的一个简单方法是在一个明确的嵌套作用域中运行它.
1 var q="全局的"; 2 function test(x){ 3 (function(){eval(x);})(); 4 return q; 5 } 6 alert(test("var q='局部的';"));//局部的 7 alert(test("var z='局部的';"));//全部的
二.eval的直接调用和间接调用
//这是直接调用 var g="全局的"; function test(){ var x="局部的"; return eval("x"); } alert(test());//局部的
1 //这是间接调用 2 var g="全局的"; 3 function test(){ 4 var x="局部的"; 5 var f=eval; 6 return f("x"); 7 } 8 alert(test());
不提倡这种做法.<<Effective Javascript>>上有这种说法.但是在浏览器上测试的话,就是不通过.会出现报错现象.
1 /* 2 一种奇葩的eval间接调用方式. 3 */ 4 var g="全局的"; 5 function test(){ 6 var x="局部的"; 7 return (0,eval)("x");//是不是很奇葩的调用 8 } 9 //alert(test());//局部的
(0,eval)("x");是如何工作的呢?
数字0被求值但其值被忽略了,括号说执行的结果是eval函数.因此,(0,eval)的行为几乎与简单的eval函数表示完全一致.
单子这种间接的调用eval函数的方式性能更加好,速度更加的快.
相关文章
- [译] 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击
- JavaScript操作Cookie
- JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】
- JavaScript经典代码【一】【javascript HTML控件获取值】
- JavaScript HTML DOM 元素(节点)
- [Javascript] Safely Access a Property on a JavaScript Array with Optional Chaining
- [Javascript] Natively Format JavaScript Dates and Times
- [Javascript] String Padding in Javascript using padStart and padEnd functions
- [Javascript] Identify and Deal with NaN in JavaScript
- [Javascript] Hoisting in JavaScript
- 【JavaScript】jQuery
- [Javascript] Javascript numeric separators
- [Javascript] Understanding the difference between .prototype and .__proto__ in JavaScript
- [Javascript] Use requestIdleCallback to schedule JavaScript tasks at an optimal time
- [Javascript] Decorators in JavaScript
- [Javascript] JavaScript Array Methods in Depth - push
- 关于Fiori应用sandbox JavaScript的两个疑问
- 关于 JavaScript 事件循环 Event Loop 的一些理解
- 关于 Orbeon form PE 版本使用 JavaScript Embedding API 的一个例子
- 只要200行JavaScript代码,就能把特斯拉汽车带到您身边
- JavaScript中的几个重要概念
- javascript 字符串转unicode
- 【华为OD机试 2023】最优高铁城市修建方案(C++ Java JavaScript Python)
- JavaScript学习总结(四)——this、原型链、javascript面向对象
- Javascript 香蕉分段吃(数组分隔)
- python web py入门(18)- 用javascript写第一个Hello World程序
- 精通Javascript 函数式array.forEach的8个案例