在JavaScript中,函数就是对象。对象是“名/值”对的集合,并拥有一个连接到原型对象的隐藏连接。

对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype)。

每个函数在创建时附有两个隐藏属性:函数的上下文,以及实现函数行为的代码。

函数字面量可以出现在任何允许表达式出现的地方。函数也可以被定义在其他函数中。一个内部函数自然可以访问自己的参数和变量,同时它也能方便访问它被嵌套在其中的那个函数的参数与变量。通过函数字面量创建的函数对象包含一个连接到外部上下文的连接。这被称为闭包。

函数被调用时,除了声明时定义的形式参数,每个函数接收两个附加参数:this和arguments。arguments表示函数被调用时传递给它的参数列表,有length属性,但不是数组。

JavaScript中一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。这些模式在如何初始化关键参数this上存在差异。

方法调用模式
当一个函数保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。方法调用形式:obj.fun();方法可以通过this去访问对象,所以它能从对象中取值或修改对象。this到对象的绑定发生在调用的时候。这个“超级”迟绑定(very late binding)使得函数可以对this高度复用。通过this可取得它们所属对象的上下文的方法称为公共方法。

函数调用模式
当一个函数并非一个对象的属性时,那么它被当做一个函数来调用:
var sum=add(3,4);
当函数以此模式调用时,this被绑定到全局对象。这是语言设计上的一个错误(正确的做法是,当内部函数被调用时,this应该绑定到尾部函数的this变量),这个错误使得方法不能利用内部函数来帮它工作,因为内部函数的this被绑定了错误的值。(可以再内部函数为定义一个局部变量,保存外部函数的this)

构造器调用模式
如果在一个函数前面带上new来调用,那么将创建一个隐藏连接到改函数的prototype成员的新对象,同时this将会被绑定到那个新对象上。

Apply调用模式
可以调用函数,在传递参数的同时,还可以指定函数内this的值。

var arr=[3,4];
var sum=add.apply(null,arr);

作用域
JavaScript是根据函数来划分作用域的。函数可以访问其所在的作用域,函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量,在改函数中的任何地方都可以看见(最好的做法就是在函数顶部声明所有变量)。

闭包
作用域的好处就是内部函数可以访问定义它们的外部函数的参数和变量(除了this和argumnets)。函数可以访问它被创建时所处的上下文环境,这被称为闭包。

模块
我们可以使用函数和闭包来构建模块。模块是一个提供接口却隐藏状态与实现的函数或对象。

发表评论

电子邮件地址不会被公开。 必填项已用*标注