标签:形式 实参 call new 它的 形参 匿名函数 def 一个
任何函数只要作为方法调用实际上都会传入一个隐式的实参,这个实参是一个对象,方法调用的母体就是这个对象。
函数的参数(实参和形参)
1、可选参数
当调用函数的时候传入的实参比函数声明时指定的形参个数要少,剩下的形参都将设置为undefined
function getPropertyName(o, /*optional*/a) { if(!a) a = [] // 相当于a = a || [] for(var property in o) a.push(property) return a } var a = getPropertyName(o) //将o的属性存储到一个新数组中 get PropertyNames(p, a) //将p的属性追加至数组a中
2、可变长的实参列表:实参对象(不定实参函数)
在函数体内,标识符arguments是指向实参对象的引用,实参对象是一个类数组对象,这样可以通过数字下标就能访问传入函数的实参值,而不是非要通过名字来得到实参,arguments有个length属性
实参对象的个数获取
function f(x, y, z) { if(arguments.lenght != 3) { //抛出异常,并做异常的处理 } //再执行函数的其他逻辑 }
3、callee和caller属性
callee属性在某些时候会非常有用,比如在匿名函数中通过callee来递归地调用自身
var factoral = function(x) { if(x <= 1) return 1 return x * arguments.callee(--x) }
4、闭包
关于闭包的理解
function counter() { var n = 0 return { count: function() {return n++} reset: function() {n = 0} } } //以下c和d是不会互相影响的 var c = counter(), d = counter() c.count() // =>0 d.count() // => 0 c.reset() // reset()和count()共享状态 c.count() // =>0 因为c被重置了 d.count() // =>1 d没有被重置,所以d的count结果还是1
5、函数属性、方法和构造函数
1、length属性
2、prototype属性
3、call()方法和apply()方法
apply()方法和call()类似,但是传入实参的形式和call()有所不同,它的实参都放入一个数组中
function trace(o, m) { var original = o[m] o[m] = function() { console.log(new Date() , "Entering", m) var result = original.apply(this, arguments) console.log(new Date(), "Exiting", m) return result } }
4、bind()方法
5、toString()方法
6、可调用的对象
6、函数式编程
可以使用方法map()和reduce()来实现数组的计算
var sum = function(x, y) {return x + y} var square = function(x){return x * x} var data = [1,1,3,5,5] var mean = data.reduce(sum)/data.length var deviations = data.map(function(x) {return x - mean}) var stddev = Math.sqrt(deviations.map(square).reduce(sum)/(data.length - 1))
7、高阶函数
所谓高阶函数,就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数
function not (f) { return function() { var result = f.apply(this,arguments) return !result } } var even = function(x) { return x % 2 === 0 } var odd = not(even) [1,1,3,5,5].every(odd) ; //true , 每个元素都是奇数
标签:形式 实参 call new 它的 形参 匿名函数 def 一个
原文地址:https://www.cnblogs.com/jun-web/p/function.html