instanceof关键字
判断构造函数的原型是不是在对象的原型链上
1 | 对象 instanceof 构造函数 |
创建函数的三种方式
函数声明
1 | function 函数名(参数列表){ |
函数表达式
1 | var 函数名 = function (参数列表){ |
Function
1 | var 函数名 = new Function(); |
Function的使用
1 |
|
如何解决Function的函数体过长的问题?
- 字符串拼接
- 使用模板引擎
- 使用反引号
eval的使用
eval是个函数,可以将字符串转换成代码并立即执行!
1 | eval(符合js语法规范的字符串); |
使用eval处理JSON格式数据的时候的问题
当使用eval处理JSON格式数据的时候,eval会将JSON格式字符串中的大括号{},当做代码段来解析,所以会报错!
解决方案:
将变量声明也同时放在eval中
1
2
3var jsonStr = "{key: value}";
eval("var obj=" + jsonStr);在json格式的字符串前后拼接小括号
1
2
3var jsonStr = "{key: value}";
var obj = eval("(" + jsonStr + ")");
JSON2
Function和eval的异同
- 都能将字符串转换成代码
- Funciton创建出来的是函数,需要手动去调用,代码才会执行,而eval会直接将字符串转成代码并执行
问题:
- 执行效率的问题
- 安全性问题(XSS)
函数的原型链
如果将函数当做一个对象对待的话,那么他也是由构造函数创建出来的,所以这个函数对象,也会有相应的原型链
js中所有的函数的构造函数都是Function, 包括Function本身
完整的原型链绘制
Object和Function的关系
可以通过instanceof关键字来确定两者的关系, Object和Function互为实例!!
arguments对象
arguments是函数内部的一个对象,他是一个伪数组
在函数调用的时候,会将函数的实参,依次的存入这个伪数组中。
arguments.length 属性,表示函数在调用的时候,传入的实参的个数
arguments.callee 属性,指的就是arguments对象所在的函数,一般用来在匿名函数中做递归
函数对象的成员
- arguments
- caller 函数的调用环境,如果是在全局,则为null,如果是在其他函数当中调用的,那么caller为所在的那个函数
- length 函数的形参的个数
- name 函数的名称 函数声明和函数表达式的函数名为正常的函数名,new Function创建出来的函数名为 anonymous
静态成员以及实例成员
- 静态成员: 通过构造函数访问的成员就是静态成员
- 实例成员: 通过实例去访问的成员就是实例成员