字符串还能当做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代码执行的方法的更多相关文章

  1. js:把字符串转为变量使用; js下将字符串当函数去执行的方法

    1 把字符串当变量使用 通过计算 string 得到的值(如果有的话).该方法只接受原始字符串作为参数 demo: var type = "car"; var newStr = & ...

  2. js 将字符串当作js表达式执行方法

    听同事说了一个需求.他有一个数据对象obj,接口会给他返回一个索引key,这个key长度不固定,根据这个key去修改obj对应的值. 举个例子: let obj={"level1" ...

  3. xss 防止攻击,恶意用户将输入的信息当成html或js代码执行,办法是将用户输入的信息改为text格式,或特殊符号转义

    xss 防止攻击,恶意用户将输入的信息当成html或js代码执行,办法是将用户输入的信息改为text格式,或特殊符号转义 XSS攻击的防范 XSS攻击造成的危害之所以会发生,是因为用户的输入变成了可执 ...

  4. js代码执行顺序问题

      前  言 LiuDaP 今天就给大家介绍一个特别基础的东西,javascript中函数的一点儿小知识(js代码的执行顺序),希望对大家有那么一点点帮助吧!!! 一.js--->单线程 严格意 ...

  5. [js]js代码执行顺序/全局&私有变量/作用域链/闭包

    js代码执行顺序/全局&私有变量/作用域链 <script> /* 浏览器提供全局作用域(js执行环境)(栈内存) --> 1,预解释(仅带var的可以): 声明+定义 1. ...

  6. WinForm程序执行JS代码的多种方法以及使用WebBrowser与JS交互

    方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details ...

  7. WinForm中执行JS代码(多种方法)

    方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details ...

  8. js 代码大全(各种方法、属性)

    事件源对象event.srcElement.tagNameevent.srcElement.type捕获释放event.srcElement.setCapture(); event.srcElemen ...

  9. 自动化测试-20.selenium常用JS代码执行

    前言: 在工作中有些控件定位不到,需要操作,使用JS代码去修改或者操作达到selenium不能做的操作. 1.Web界面的滑动 1 #coding:utf-8 2 from selenium impo ...

随机推荐

  1. python处理Excel文件的几个模块

    在python中简单地处理excel文件,有几个相关的模块,各有千秋,本文将不定时收录. Python Excel网站收集了关于python处理excel文件的各种信息. [注意]使用python处理 ...

  2. springboot 整合 web 项目找不到 jsp 文件

    今天遇到一个问题,就是使用springboot整合web项目的时候,怎么都访问不到 \webapp\WEB-INF\jsp\index.jsp 页面.这个问题搞了半天,试了各种方式.最后是因为在启动的 ...

  3. DP动态规划学习笔记——高级篇上

    说了要肝的怎么能咕咕咕呢? 不了解DP或者想从基础开始学习DP的请移步上一篇博客:DP动态规划学习笔记 这一篇博客我们将分为上中下三篇(这样就不用咕咕咕了...),上篇是较难一些树形DP,中篇则是数位 ...

  4. (三)自定义Realm

    一.Realm概念 Realm:域,Shiro从从Realm获取安全数据(如用户.角色.权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用 ...

  5. C#强制回收垃圾

    [DllImport("psapi.dll")] private static extern int EmptyWorkingSet(int hProcess); public v ...

  6. 生成 excel 插件 Epplus

    最近做 .net core 项目 发现一个新的 生成excel 的插件 . 以前值用 aspose 或者 npio. 简介:Epplus是一个使用Open Office XML(Xlsx)文件格式,能 ...

  7. iOS-OC中常见的一些宏

    /* 1. 颜色 */ #define PCBRGBColorA(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b ...

  8. 操作系统 (OS)

    1. 操作系统(Operation System,OS) 操作系统作为接口的示意图 没有安装操作系统的计算机,通常被称为 裸机 如果想在 裸机 上运行自己所编写的程序,就必须用机器语言书写程序 如果计 ...

  9. Linux路径切换命令——directory stack

    操作directory stack一共需要3个命令: dirs .pushd.popd dirs: 显示当前目录栈 pushd: 把目录压栈 popd: 把目录弹栈 dirs 显示目录栈内容,如果没有 ...

  10. 【2017-12-12】Winform----Datagirdview使用

    1.数据绑定 DataGirdView.DataSource = list集合 2.复选框 获取复选框选中状态 for (int i = 0; i < dataGridView1.RowCoun ...