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(){ ...
随机推荐
- java RPC系列之一 rmi
java RPC系列之一 rmi 一.java RPC简单的汇总 java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) .Caucho的Hessian 和 Burlap . ...
- 函数编程中functor和monad的形象解释
函数编程中functor和monad的形象解释 函数编程中Functor函子与Monad是比较难理解的概念,本文使用了形象的图片方式解释了这两个概念,容易理解与学习,分别使用Haskell和Swift ...
- Swift - what's the difference between metatype .Type and .self?
Declaration typealias AnyClass = AnyObject.Type .Type The metatype of a class, structure, or enumera ...
- 创建一个dynamics CRM workflow (五) - Deploy Custom Workflows
我们打开plugin registeration tool. 注册一个新的assembly. custom workflow 和 plugin注册的方法还有些不同. 这一步custom workflo ...
- Vue2实例中的data属性三种写法与作用
<script src="https://unpkg.com/vue/dist/vue.js"></script> <div id="app ...
- 无法打开文件"CChart_d.lib"
把4个.lib文件删掉重新加一遍就好了
- windows 端口号占用和解决方法
https://blog.csdn.net/qq_39657909/article/details/80378983
- 配置thinkphp项目遇到的坑
坑一: nginx配置必须改成伪静态配置 否则出现nginx 403 forbiddem错误 坑2: 缓存目录权限必须开放 坑3:服务器权限准备: 坑4:防火墙关闭 systemctl stop fi ...
- CSS - Span 下的width设置不可用?
解决:Span 下的width设置不可用? 内联元素-span有根据内容自动伸缩的能力,当需要对其宽度设定时,出现无效的情况. Demo:http://jsfiddle.net/JSDavi/ad62 ...
- sessionStorage与clone方法在项目中的应用
//资料列表: //JSON.parse(jsonstr); //json格式字符串转换成json对象 //JSON.stringify(jsonobj); //json对象转换成json格式字符串 ...