函数对象
JavaScript中的函数就是对象。对象是“名/值”对的集合并拥有一个连到原型对象的隐藏连接。对象字面量产生的对象连接到 Object.prototype。函数对象连接到 Function.prototype(该原型对象本身连接到 Object.prototype)。每个函数在创建时会附加两个隐藏属性:函数的上下文和实现函数行为的代码。
函数字面量
什么叫函数字面量?里面包含了
- 保留字function
- 函数名
- 参数
- 函数实现
一个内部函数出了可以访问自己的参数和变量,同时它也能自由访问把它嵌套在其中的父函数的参数和变量。
通过函数字面量创建的函数对象包含一个连到外部上下文的连接,这称为闭包。
调用
一共有四种调用模式:方法调用模式,函数调用模式,构造器调用模式和apply调用模式。
方法调用模式
含义:当一个函数被保存为对象的一个属性时,成为一个方法。
函数调用模式
含义:当一个函数并非一个对象的属性时,那么它就是被当做一个函数来调用。
以此模式调用函数时,this被绑定到全局对象。
构造器调用模式
如果在一个函数前面带上new来调用,那么背地里将会创建一个连接到该函数的prototype成员的新对象,同时this会绑定到那个新对象上。
“类”最好使用大写格式命名;
如果调用构造器函数时没有在前面加上new,这会导致既没有编译时警告,也没有运行时警告,所以大写约定非常重要。
apply调用模式
apply方法让我们构建一个参数数组传递给调用函数,它也允许我们选择this的值。apply方法接收两个参数,第一个是绑定给this的值,第二个值是一个参数数组。
参数
当函数调用的时候,可以获得arguments数组,函数可以通过此函数访问所有它被调用时传递给它的参数列表(并不是函数定义时的那些参数,而是调用时传递的参数)。
arguments并不是一个真正的数组,它只是一个类似数组的对象,但是它有一个length属性。
返回
一个函数总是会返回一个值,如果没有指定返回值,则返回undefined。
扩充类型的功能
通过给Object.prototype添加方法,可以让该方法对所有对象都可用,这样的方式同样对函数、数组、字符串、数字正则表达式同样适用。
闭包
避免在循环中创建函数,他可能会造成无谓的计算,还会引起混淆。
模块
可以使用函数和闭包来构造模块,模块是一个提供接口却隐藏状态与实现的函数或对象。
模块模式一般形式是:一个定义了私有变量和函数的函数,利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把它们保存到一个可以访问的地方。
级联
有一些方法没有返回值,如果我们让这些方法返回this而不是undefined,就可以启用级联;在一个级联中,我们可以在单独一条语句中依次调用同一个对象的很多方法。
getElement("content")
.a(10)
.b("b")