把字符串当做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 ...
随机推荐
- (二十八)jsp之EL表达式
一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- 【Transact-SQL】让人快遗忘的游标
原文:[Transact-SQL]让人快遗忘的游标 最初学SQL Server的时候,当学到游标的时候,突然有了一种亲切感,因为这种通过一个while循环,一条一条的处理数据的方式,很像学过的过程式语 ...
- pytorch入门1——简单的网络搭建
代码如下: %matplotlib inline import torch import torch.nn as nn import torch.nn.functional as F from tor ...
- 针对IE6 7 8当独写样式
IE8的格式: .foot{padding:12px 10px\9;} //在后面加\9 IE7的格式: .foot{*padding:12px 10px\9;} //在前面加* IE6的格式: .f ...
- stm32 i2c eeprom 24C02
电路图 相关文章:http://blog.csdn.net/zhangxuechao_/article/details/74936798 举例 #define i2c_scl PBout(10) #d ...
- swore tcp服务学习
TcpServer.php <?php /** * Created by PhpStorm. * User: mac * Date: 2019/9/13 * Time: 20:33 */ cla ...
- java入门学习总结_03
1.键盘录入 2.分支结构 键盘录入 概述 1.键盘录入:在程序运行的过程中,可以让用户录入一些数据,存储在内存的变量中,在后续的程序运行过程中,可以使用这些数据. 2.步骤: 第一步:导包,在类声明 ...
- 【python】python configparser模块
ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section), 每个节可以有多个参数(键=值).使用的配置 ...
- InnoDB引擎中的索引与算法9
5.1 InnoDB支持以下几种常见的索引: B+树索引 全文索引 哈希索引(自适应哈希索引) 关于哈希索引的说明: -- 1.InnoDB的哈希索引是自适应的,其根据表的使用情况自动生成哈希索引,不 ...
- POST,PUT和PATCH的区别
1. GET方法用于获取资源,不应有副作用,所以是幂等的. 比如:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用.请 ...