函数
函数即是一种特殊的对象——函数对象,初始化一个Function如下:
1 | var funName = new Function( [argname1, [...argnameN]], body ); |
通过new
关键字创建了一个Function
对象,和使用new String("test")
创建String
对象是一个道理。现在的语法糖,通过字面量来创建函数,如:
1 | function add(x, y) { |
原型
对象拥有__proto__
和constructor
属性,__proto__
属性表示的就是它的父原型,其中包含了父原型的所有属性,如果在当前对象中找不到某个属性,就会沿着原型链查找父原型中是否有某个属性,如果到了最上层(Object
的上层是null
)也找不到,则返回undefine
。
函数是一种特殊对象,不仅拥有上述两种属性,还拥有一种prototype
属性。在通过new
创建一个类的实例对象的时候,prototype
属性的成员都成为实例化对象的成员。
函数作用域
JavaScript的函数是在局部作用域内运行的,在局部作用域内运行的函数可以访问外层的变量和函数。Javascript的作用域为词法作用域,其作用域是在定义时(词法分析时)就确定下来的,而并非在执行时确定,如:
1 | var str = "global"; |
词法分析结束后,构建作用域链的时候,会将函数内定义的str
变量放入该链,因此在整个test
函数内可见。
数组
特性
在JavaScript中,length
并非只读属性,可以手动改变,如:
1 | var array = [1,2,3,4,5] |
手动减小length
会使得数组部分元素变得不可用。
以字符串可以作为数组的下标,就采用访问JavaScript对象的属性的方式进行,但是数组本身的length
属性不会发生变化,如:
1 | var stack = []; |
排序
数组的sort方法不关注数组内容是数字还是字母,只会按照字母的字典顺序来进行排序,如:
1 | var array = [0, 1, 2, 3, 23, 12]; |
可以通过给sort
传递一个函数对象,按照函数规则排序。
new 操作符
在JavaScript中使用new操作符并不是直接新建一个函数对象,如:
1 | function Shape(type) { |