函数对象
javascript中函数就是对象。函数对象是名/值对的集合并拥有一个连接到原型对象的隐藏连接。对象字面量产生的对象连接到Object.prototype 函数对象连接到Function.prototype。
函数在创建时附加两个隐藏属性:函数上下文? 实现函数行为的代码
每个函数对象在创建时也随配有一个prototype属性,它的值是一个拥有constructor属性且值即为该函数的对象,以后具体解释
因为函数是对象,所以它可以像其他对象一样被使用:
- 可以保存在变量 对象 数组中
- 可以当做参数传递给其他函数
- 可以在返回函数
- 函数是对象,所以函数可以拥有方法
- 它的与众不同是它可以被调用
函数字面量
函数字面量包括四个部分
第一部分是保留字function
第二部分是函数名,可以被省略。
第三部分是包围在圆括号中的一组参数,这些参数的名称将被定义为函数中的变量,它们不像普通变量被初始化为undefined,而是在该函数被调用时初始化为实际提供的参数的值
第四部分是包围在花括号中的一组语句。这些语句是函数的主体,函数被调用的时候执行
通过函数字面量创建的函数对象包含一个连到外部上下文的连接,这被称为闭包
调用
?调用一个函数会暂停当前函数的执行,传递控制权和参数给新函数,除了声明时定义的形式参数,每个函数还接收两个附加参数:this和argument。this的值取决于函数的调用模式。在javascript中有四种调用模式:
- 方法调用模式
- 函数调用模式
- 构造器调用模式
- apply调用模式
当实际参数与形式参数个数不匹配的时候不会导致运行时错误,如果多了,多出的参数会被忽略,如果不够,则用undefined补齐,不会对参数进行类型检查
方法调用模式
当一个函数被保存为对象的一个属性时,我们称之为方法,当一个方法被调用时,this绑定到该对象。
如果调用表达式包含一个提取属性动作(即包含一个 . 点表达式或[ ]下标表达式)那么它被当做一个方法调用
var myObject = { value:0, increment:function(inc){ this.value += typeof inc === 'number'?inc:1; } } myObject.increment(); document.writeln(myObject.value); //1 myObject.increment(2); document.writeln(myObject.value); //
?
通过this可取得它们所属对象的上下文方法称为公共方法(public method)
?
函数调用模式
当一个函数并非一个对象的属性时,那么它就是被当做一个函数来调用
此模式调用函数时,this被绑定到全局对象。为了解决这个错误让内部函数帮助外部方法工作,可以定义一个that变量把this赋值给他,内部函数可以通过访问that访问到this
myObject.double = function(){ var that = this; var helper = function(){ that.value = add(that.value,that.value); } helper(); } myObject.double(); document.writeln(myObject.value); //6
?构造器调用模式
如果一个函数前面带上new来调用,那么背地里将会创建一个连接到该函数的prototype成员的新对象,this会绑定到这个对象上
var Quo = function(string){ var that = this; this.status = string; } Quo.prototype.get_status = function(){ return this.status; } var myQuo = new Quo("confused"); document.writeln(myQuo.get_status());
?apply调用模式
因为javascript是一门函数式的面相对象编程语言,所以函数可以拥有方法
apply方法让我们构建一个参数数组传递给调用函数。它也允许我们选择this的值。apply方法接收俩个参数,第一个是要绑定给this的值,第二个就是一个参数数组
var array =[3,4]; var sum = add.apply(null,array); //sum = 7 var statusObject = { status:'a-ok' } var status = Quo.prototype.get_status.apply(statusObject); //'a-ok'
?参数
?当函数被调用时,会得到一个免费的陪送参数argument数组。函数可以通过此参数访问所有它被调用时传递给他的参数列表,包括多余的参数。这使得编写一个无须指定参数个数的函数成为可能
var sum = function(){ var i,sum = 0; for(i = 0;i < arguments.length;i++){ sum += arguments[i]; } return sum; }; document.writeln(sum(4,8,15,16,23,42)); //108
?