把字符串当做js代码执行的方法
字符串还能当做javascript代码来执行?你能想到哪些方法?
1、setInterval("要执行的字符串",500);
window对象的方法既可以传字符串,也可以传函数。该函数第一个参数传字符串容易引起内存泄漏,尽量避免这样写。
2、setTimeOut("要执行的字符串",500);
window对象的方法既可以传字符串,也可以传函数。该函数第一个参数传字符串容易引起内存泄漏,尽量避免这样写。
3、eval("要执行的字符串");
4、new Function("要执行的字符串");
5、<script>"要执行的字符串"</script>
6、es6的import
下面主要说说Javascript的全局函数eval()和new Function()构造函数。
一、eval()
eval()可以动态解析和执行字符串,它直接把字符串当做Javascript代码执行,eval函数接收一个参数str,如果str不是字符串,则直接返回str,否则执行str语句。如果str语句执行结果是一个值,则返回此值,否则返回undefined。
JavaScript规定,如果行首是大括号,一律解释为语句(即代码块)。如果要解释为表达式(即对象),必须在大括号前加上圆括号。
eval('{foo: 123}') // 123
eval('({foo: 123})') // {foo: 123}
1、执行作用域
var a = 'global scope';
function b(){
var a = 'local scope'
eval('console.log(a)'); //local scope
}
b();
eval中的代码执行时的作用域为当前作用域,它可以访问到函数中的局部变量,不能访问全局变量。
如果需要,自己可以封装一个函数,让eval能访问全局。
var myNameSpace = {};
myNameSpace.Eval = function(code){
if(!!(window.attachEvent && !window.opera)){
//ie
execScript(code);
}else{
//not ie
window.eval(code);
}
}
传递到eval()中的字符串:如果eval()是被直接调用的,this指的是当前对象;如果eval()是被间接调用的,this就是指全局对象。eval() 方法可以将字符串转换为JavaScript 代码并运行。
//eval()的直接调用
eval('...') //eval()的间接调用
eval.call(null, '...')
window.eval('...')
(1, eval)('...')
(eval, eval)('...')
2、能否携带with表达式
在严格模式下,eval解析function的字符串中不允许携带with(x)表达式。
3、安全性
<script>
var a = 1;
eval("var a=2;"); //改变了当前域的变量a
alert(a);
</script>
《高性能Javascript》一书指出,在代码中使用eval是很危险的,特别是用它执行第三方的JSON数据(其中可能包含恶意代码)时。应该尽可能使用JSON.parse()方法解析字符串本身,该方法可以捕捉JSON中的语法错误,并允许你传入一个函数,用来过滤或转换解析结果。
eval非常耗性能,解析成JS代码要耗能,执行时也要耗能。
二、new Function()
new Function(arg1, arg2, ..., argN, function_body);中的参数和函数体都以字符串形式传入。
new Function()可以动态解析和执行字符串,它把传入的字符串封装为anonymous匿名函数并返回,直到调用这个返回函数时,才会执行字符串所要执行的操作。编程中并不经常用到,但有时候应该是很有用的。
1、执行作用域
var a = 'global scope';
function b(){
var a = 'local scope';
(new Function('','console.log(a)'))(); //global scope
}
b();
new Function中的代码执行时的作用域为全局作用域,不论它在哪个地方被调用,它访问的都是全局变量a,它无法访问b函数内的局部变量。
2、能否携带with表达式
在严格模式下,new Function()的字符串中可以携带with(x)表达式,因为new Function产生的是global 作用域下的函数,默认是非严格模式。
3、安全性
<script>
var a = 1;
new Function("var a=3;")(); //不改变当前作用域的变量
alert(a);
</script>
三、总结
综上,可以发现使用new Function()运行字符串会好一些,这也就是为什么很多模板引擎采用new Function(),而没有用eval()的原因吧
把字符串当做js代码执行的方法的更多相关文章
- js:把字符串转为变量使用; js下将字符串当函数去执行的方法
1 把字符串当变量使用 通过计算 string 得到的值(如果有的话).该方法只接受原始字符串作为参数 demo: var type = "car"; var newStr = & ...
- js 将字符串当作js表达式执行方法
听同事说了一个需求.他有一个数据对象obj,接口会给他返回一个索引key,这个key长度不固定,根据这个key去修改obj对应的值. 举个例子: let obj={"level1" ...
- xss 防止攻击,恶意用户将输入的信息当成html或js代码执行,办法是将用户输入的信息改为text格式,或特殊符号转义
xss 防止攻击,恶意用户将输入的信息当成html或js代码执行,办法是将用户输入的信息改为text格式,或特殊符号转义 XSS攻击的防范 XSS攻击造成的危害之所以会发生,是因为用户的输入变成了可执 ...
- js代码执行顺序问题
前 言 LiuDaP 今天就给大家介绍一个特别基础的东西,javascript中函数的一点儿小知识(js代码的执行顺序),希望对大家有那么一点点帮助吧!!! 一.js--->单线程 严格意 ...
- [js]js代码执行顺序/全局&私有变量/作用域链/闭包
js代码执行顺序/全局&私有变量/作用域链 <script> /* 浏览器提供全局作用域(js执行环境)(栈内存) --> 1,预解释(仅带var的可以): 声明+定义 1. ...
- WinForm程序执行JS代码的多种方法以及使用WebBrowser与JS交互
方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址 http://www.microsoft.com/downloads/details ...
- WinForm中执行JS代码(多种方法)
方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址 http://www.microsoft.com/downloads/details ...
- js 代码大全(各种方法、属性)
事件源对象event.srcElement.tagNameevent.srcElement.type捕获释放event.srcElement.setCapture(); event.srcElemen ...
- 自动化测试-20.selenium常用JS代码执行
前言: 在工作中有些控件定位不到,需要操作,使用JS代码去修改或者操作达到selenium不能做的操作. 1.Web界面的滑动 1 #coding:utf-8 2 from selenium impo ...
随机推荐
- Linux通用小技能
Linux通用小技能 前言 无论你用ubuntu还是centos,通通没问题,运维这东西,踩坑写文档就是了. 小技能 新磁盘挂载 不管是阿里云还是腾讯云,还是自己的机器,请记住这条命令. mkfs.e ...
- (十一)springmvc和spring的整合
1:Maven引入相关的jar包. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
- form-create教程:给内置组件和自定义组件添加事件
本文将介绍form-create如何给内置组件和自定义组件添加事件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue ...
- php文件包含漏洞 file inclusion vulnerability
0x00 何为文件包含漏洞 开发人员如果在写类似include "a.php"的代码时,如果将a.php写成了可变的值,那么就可以在上面做文章,举个理想的例子: <? inc ...
- EBS R12.2系统logo的修改
https://blog.csdn.net/lzl1101206656/article/details/74171999 EBS系统logo的修改 转载lzl1101206656 发布于2017-07 ...
- Hibernate入门第一讲——Hibernate框架的快速入门
Hibernate框架的概述 什么是框架? 框架指的是软件的半成品,已经完成了部分功能. JavaEE开发的三层架构 了解框架的基本概念之后,我们就来看看Hibernate框架处于JavaEE开发的经 ...
- List、Set、Map集合的遍历方法
一.List集合遍历 public class TraversingList { /** * @author zhuxun describe: 定一个List集合并遍历 */ /** 定义一个List ...
- spring 时间格式问题
注解@JsonFormat主要是后台到前台的时间格式的转换 注解@DateTimeFormat主要是前后到后台的时间格式的转换 @DateTimeFormat(pattern = "yyyy ...
- LeetCode--字符串
1.给定字符串s,分区s使得分区的每个子字符串都是回文. 返回s的所有可能的回文分区.例如,给定s =“aab”,返回 [ ["aa","b"], [" ...
- idou老师教你学Istio 29:Envoy启动流程
1. 功能概述 Envoy启动时,会启动一个进程,并在这个进程中启动很多线程,这样,可以启动很多worker线程,一般worker线程数与核心数相同,每个worker线程处理所有已配置的listene ...