在javaScript 中函数就是对象,对象是'名/值'对的集合拥有一个连到原型对象的隐藏连接。
对象字面量产生的对象连接到 Object.prototype。函数连接到 Function.prototype (该原型对象本身连接到Object.prototype)。
每个函数在创建时会附加2个隐藏属性:函数的上下文 和 实现函数执行的代码(会设置一个调用属性,调用一个函数时,可以理解为:调用此函数的调用属性)。
函数字面量
函数通过函数字面量创建:
var add = function(a,b){ return a+b; }
函数字面量包含4个部分:
- 保留字 function
- 函数名,它可以被省略,函数可以用它的名字递归调用自己,如果没有名字,就称之为匿名函数
- 在圆括号中的参数,多个参数逗号隔开
- 包含在花括号中的语句,这些语句是函数的主体。在函数被调用时执行
调用
调用一个函数会暂停当前函数的执行,传递控制权和参数和新的函数,处了声明定义时的形式参数(形参),每个函数还会收到2个附加参数: this 和 arguments。
参数 this 在面向对象编程中非常重要,它的值取决于调用模式,在javaScript 中一共有4中调用模式:方法调用模式,函数调用模式,构造器调用模式,apply调用模式
方法调用模式
当一个函数被保存在一个对象属性中,我们称之为方法调用,当一个方法调用时,this会绑定到该对象,方法可以使用this访问自己所属的对象,所以能访问或者修改对象上的属性。
例如
var obj = { name: 'zs', say: function(){ this.name = 'ls'; return this.name; } } obj.say();//ls
函数调用模式
当一个函数并非一个对象属性时,那么它就是当一个函数调用,此模式下,this 会绑定全局对象。
var num = add(3,4);
构造器调用模式
如果一个函数前面带上 new 来调用,那么背地里会连接到该函数的 prototype 成员的新对象,同时this会绑定到新对象上。
var a = function(){} a.prototype.getName = function(){ return 'zs'; } var b = new a(); b.getName();//zs
apply调用模式
apply 方法让我们构建一个参数数组传递给调用函数,也允许我们选择 this 的值。apply 方法接收2个参数,第一个是要绑定给 this 的值,第2个就是一个参数数组。
var arr = [3,4]; function add (a,b){ return a + b; } var sum = add.apply(null,arr); console.log(sum);//7
function a(){ return this.name; } var t = { name: 'zs' } var name = a.apply(t); console.log(name);//zs