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 方法的应用
Java方法可以理解为C#中的函数,都是把复杂的问题简单化,按模块,按功能区分,分别完成各个部分在调用这些方法完成整个功能. 方法的综合练习,猜数字的实现: 代码要求: 生成不重复的4位数字(只有1- ...
- cordova 打包工具
一.环境安装 1.安装NodeJs https://nodejs.org 直接去官网下载并按默认路径安装就可以了. 安装完成后在命令行: (测试成功!) $ npm 2.安装Cordova 命令行 ...
- Java中方法重载
方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关. 参数列表:个数不同,数据类型不同,顺序不同. 重载方法调用:JVM通过方法的参数列表,调用 ...
- javascript的带操作符的赋值运算
看犀牛书发现的问题 下面两个表达式 表达式一 data[i++] *= 2; 表达式二 data[i++] = data[i++] * 2; var data = [7,8,9]; var i = ...
- php 常用header
//定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Content-type: application/at ...
- Python-基础-day1
一.python的介绍 1.python的出现与应用场景 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯 ...
- MySQL主要的命令(1)
创建数据库 create database db_name; 创建数据库设置字符集 create database db_name character set utf8; 修改字符集编码 数据库导出: ...
- BA--空调静压箱的作用
空调静压箱的主要作用有两个,一个是降低噪音:一个是提高送风距离.工作原理如下:空调出风从空调风机里面出来的时候,具有很大的风速,同时由于空调风机自身的结构原因,空调的出风并不均衡,空气在风管中相互摩擦 ...
- BA-siemens-点位类型表
X(超级点) 输入 0-10v 4-20ma(不可用) Ni 1000 Pt 1000 10k & 100k 热敏电阻 数字输入 脉冲计数输入 输出 0-10v 4-20ma(不可用) 数字 ...
- 一个关于Class的小点
public 是公有 private 是私有 没有写就是private