JavaScript的函数(一)
,1,在javascript中,函数即对象。函数里面的参数可以是个函数,例如:
data.sort(function(a,b){return a-b;})
函数的返回值,return语句导致函数停止执行,并返回它的表达式(如果有的话)的值给调用者。如果没有返回值的函数,就是没有return,就是返回 undefined值给调用者。没有返回值的函数有时候称为过程。
2,嵌套函数:
有趣之处在于他的变量作用域规则。就是函数里面可以嵌套一个函数。
3,函数调用:
作为函数;
作为方法(无非是保存在一个对象属性里面的javascript函数);
作为构造函数;
通过它们的call()和apply()方法间接调用。
方法和this关键字是面向对象编程范例的核心。任何函数只要作为方法调用,实际上都会传入一个隐式的实参---这个实参是一个对象。方法调用的母体就是这个对象。
var o = { m:function(){ var self = this; console.log(this === o); f(); function f(){ console.log(this); console.log(self === o); } } } 执行 o.m() 结果: true false true
这里说明一点:嵌套函数里面的this指向问题:this的值是全局对象或者undefined,如果要用外层函数的上下文环境,则需要将this的值保存在一个变量self里面。
4,方法链:
当方法的返回值是一个对象,这个对象还可以再调用它的方法,形成链式的调用方式。
当方法并不需要返回值时,最好直接返回this。如果 在设计的API中一直采用这种方式(每个方法都返回this)。使用API就可以进行“链式调用”,不要将方法的链式调用和构造函数的链式调用混为一谈。
5,构造函数的调用:
首先:如果构造函数没有形参,可以省略圆括号,
var o = new Object(); var o = new Object;
这个两种写法是等价的。其次:new o.m();调用上下文不是o,而是这个新对象作为调用上下文。
最后:函数的返回值,构造函数通常不使用return关键字。
6,可变长的实参列表:实参对象
当:实参列表 > 形参个数,没有办法获得未命名值的引用。参数对象解决了这个问题。在函数体内,arguments是指向实参对象的引用。实参对象是一个类数组对象。可以通过下标来访问实参值。不用非得通过名字来得到实参。
实参对象有一个重要的用处:就是让函数可以操作任意数量的实参。例如:
function max(){ var max = Number.NEGATIVE_INFINITY; for(var i = 0;i<arguments.length;i++){ if(arguments[i] > max){ max = arguments[i]; } } return max; } var largest = max(1,10,100,2,3,1000,4,5,1003);//1003
类似这种函数可以接收任意个数的实参。也称为:“不定实参函数”。
remember:arguments并不是真正的数组,而是一个实参对象。可以这样理解:它是一个对象,只是碰巧拥有以数字为索引的属性。
实参对象还定义了callee和caller属性。arguments.callee()属性指向当前正在执行的函数。caller是非标准的,单大多数浏览器都实现了这个属性。实用场景:匿名函数中通过callee来递归调用自身。
var factorial = function(x){ if(x <= 1) return 1; return x*arguments.callee(x-1); } factorial(10) //这里就是一个10*9*8*7*6*5*4*3*2*1的方法,用的是递归 匿名函数的实现方式: (function(x){ if(x <= 1) return 1; return x*arguments.callee(x-1); }(10)) //同样也是可以实现该递归的方法
7.将对象属性用作实参:
当一个函数包含超过三个形参时,最好通过名/值对的形式来传入参数。这样参数的位置就无关紧要。而且这种写法允许在函数中设置省略参数的默认值。