Function 和 eval 知识点总结
1 Function
1.1 函数的创建方式
- 1 函数声明
- 2 函数表达式
- 3 new Function
// 1
function foo() {} // 2
var foo = function() {};
- 结论:函数也是对象
1.2 任意函数都是Function的实例
通过 new Function,得出:函数也是对象
- instanceof 再解释
console.log(Array instanceof Function);
function PersON() {}
console.log(PersON instanceof Function);
console.log(Date instanceof Function);
console.log(Object instanceof Function); // Function也是函数
console.log(Function instanceof Function);
1.3 new Function
使用
- 语法
// 伪代码
var funcName = new Function(arg1, arg2, ..., argN, functionbody); // 示例
var func = new Function("a", "console.log(a)");
func();
- 注意点
1 所有的参数都是字符串类型
2 除了最后一个参数,所有的参数都作为生成函数的参数
3 参数可省略
4 最后一个参数,表示函数体
- 案例:求两个数的最大值
// 原始写法
function max(a, b) {
return a > b ? a : b;
} var fnMax = new Function("a", "b", "return a > b ? a : b;"); var ret = fnMax(3, 8);
console.log(ret);
- 练习:求传入数字的和
1、有两个参数?
2、多个参数?a.拼接字符串 b.模板(不做要求)
// 两个参数
var fncSum = new Function("a", "b", "return a + b;");
fncSum(1, 1); // 多个参数
// 将字符串进行换行分割
var fnSum = new Function(
'var total = 0, ' +
' args = arguments, ' +
' len = args.length; ' +
'for ( var i = 0; i < len; i++ ) { ' +
' total += args[ i ]; ' +
'} ' +
'return total;'
);
- 使用模板(不做要求)
<script type="text/html" id="engin">
var total = 0,
args = arguments,
len = args.length;
for ( var i = 0; i < len; i++ ) {
total += args[ i ];
}
return total;
</script>
<script>
var getBody = function (id) {
var script = document.getElementById( id );
var body = script.innerHTML;
script.parentNode.removeChild(script);
return body;
} var fnSum = new Function(getBody('engin'));
var res = fnSum(1, 2, 1);
alert(res); </script>
1.4 Function 和 eval
共同点:都可以将字符串作为js代码来执行
1.4.1 eval
- 语法:eval("字符串");
- 作用:这个函数在调用的时候会将字符串作为js代码来执行
eval("var a = 10;");
console.log(a);
- 应用场景 - Ajax
// eval
var str = '{ name:"jim", age: 18, gender: "男"}';
var ret = eval("(" + str + ")");
console.log(ret.name);
console.log(ret.age);
console.log(ret.gender); // eval("(" + str + ")") 小括号解释:
// {} 会被解释成代码块而非对象字面量
- JavaScript中
{}
的用法:
1 代码块,用来包裹代码,组织语句
2 对象直接量/对象字面量
var str = '{ "name":"jim", "age": 18, "gender": "男"}';
eval("var o = " + str);
console.log(o);
- 使用eval将字符串转化为对象的两种方式
// 1
eval("var o = " + str);
// var obj = {}; // 2
var o = eval("(" + str + ")"); // 然后就可以把这个字符串当作是对象来使用了
1.4.2 Function和eval的区别
- 考虑效率使用
eval
- 考虑安全性用
Function
eval
会造成 全局污染
// a 是全局变量
eval("var a = 1;");
// b 是局部变量
var fn = new Function("var b = 1;");
fn(); console.log(a);
console.log(b);
- 使用new Function 处理 json字符串
var str = "{name: 'jim'}";
var o = ( new Function("return " + str) )();
// var fn = new Function("return " + str);
// var o = fn(); console.log(o.name);
- 实际项目中转化JSON:使用
JSON.parse()
- 如果有兼容性问题,此时,
json2.js
Function 和 eval 知识点总结的更多相关文章
- Javascript动态执行JS(new Function与eval比较)
new Function与eval可以动态执行JS,只要把拼接好的JS方法,然后以字符串的形式传入到这两个函数,可以执行,其中new Function用在模板引擎比较多. 用 Function 类直接 ...
- ajax for in eval()知识点的应用
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- new Function和eval区别
eval和new Function都可以动态解析和执行字符串.但是它们对解析内容的运行环境判定不同. eval中的代码执行时的作用域为当前作用域.它可以访问到函数中的局部变量. new Functio ...
- js eval()函数 接收一个字符串,做为js代码来执行。 如: s='var d="kaka"'; 或者s=‘function (code){return code }’;
eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法“{}”并不能返回一个值, ...
- eval(function(p,a,c,k,e,r)解密程序
以eval(function(p,a,c,k,e,r){e=function(c)开头的js文件是经过加密的 使用下面方法可以对js文件进行加密.解密 步骤:1.新建html页面,内容如下列代码 2. ...
- eval(function(p,a,c,k,e,d){e=function(c)加解密
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 浅谈 js eval作用域
原文:浅谈 js eval作用域 就简单聊下如何全局 eval 一个代码. var x = 1; (function () { eval('var x = 123;'); })(); console. ...
- Global eval. What are the options?
David Flanagan最近写了一个关于全局eval的简单表达式,可以用一行式子表示: var geval = this.execScript || eval; 尽管看起来很简短,但是跨浏览器的兼 ...
- 发现的eval的一个小问题
首先我们来看五段代码: 第一段代码: function test(){ eval('var a = 1;'); alert(a); } test(); 第二段代码: function test(){ ...
随机推荐
- mac os x install redis-3.2.9
下载.解压.重命名并且编译安装Redis~ wget http://download.redis.io/releases/redis-3.2.9.tar.gz ~ tar xzf redis-3.2. ...
- java中的标识符
程序员自己定义的名称,例如类名,方法名,变量等等 标识符命名的规则 1.只能由字母(a-z,A-Z),数字(0-9),下划线(_)和美元符号($)组成 2.不能以数字开头 3.不能与关键字重名 4.严 ...
- windows系统下jenkins环境搭建与基本使用
一. windows 系统下搭建jenkins环境 1.1 jenkins环境搭建和构建job流程图 1.2 安装jdk JDK下载地址: http://www.oracle.com/technet ...
- 64 求1+2+3+...+n(发散思维能力 )
题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 解题思路: 1)利用&&的短 ...
- [USACO17JAN]Promotion Counting
线段树合并. 正解好像不是线段树合并,但是出于练手的目的写了线段树合并. 大概就是对于左右子树,如果有一个为空,返回非空的,如果都不为空,就把这两个整合到一起就行了. #include <ios ...
- ASP.NET MVC5 :Attribute路由使用详解
1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attrib ...
- web端实现图片放大切换显示预览
项目中会遇到多张图片点击放大显示原图,并且能够左右滑动切换显示图片的需求,这种效果主要通过js来实现,下面我介绍的主要是借助swiper.js来实现这个完整的功能, 点击“查看协议” => 图片 ...
- 专访Bruce Douglass,谈嵌入式经验
Bruce:表面上看,编程就是想要实现什么就写什么代码:但事实是,敲代码只是软件开发过程中很小的一部分,程序员的工作还包括安全分析.责任分析.产品验证.产品分析等. =========== ...
- android开发一些小bug
1.一定要注意findViewId这种方法,尤其是含有多个同样的R.id的名字时,debug时不会当场报错.但随后会报空指针错误 2.List转换为Array能够这样处理: ArrayList< ...
- BroadcastReceiver类
java.lang.Object ↳ android.content.BroadcastReceiver 已知直接子类 AppWidgetProvider DeviceAdminReceiver ...