函数调用整理笔记
函数调用
一个调用表达式由多个函数表达式组成。每个表达式都是由一个函数对象+(+参数列表+)组成。如:
var total = distance(0,0,2,1) +distance(2,1,3,5);
var probability =factorial(5)/factorial(13);
在一个调用中,每个函数表达式都会计算出一个值,计算的结果作为参数传递给另外一个函数。这些值作为实参传递给声明函数定义的形参。
对于普通函数调用,函数的返回值成为调用函数表达式的值。如果该函数返回是因为解释器到达结尾,返回值就是undefined。如果函数返回是
解释器执行到一条return语句,返回值就是return之后的表达式的值,如果return语句没有值,则返回undefined。
注:以函数形式调用的函数通常不用this关键字,不过,this可以用来判断当前是否是严格模式。
var strict= (function(){return !this;}());
方法调用
一个方法无非是保存在一个对象的属性里的javascript函数。
o.m = f; //给o定义了一个名为m()的方法
o.m(); //给对象o定义了方法m(),调用它时就像这样
但是方法的调用和函数的调用有一个重要的区别:即调用上下文
var calculator = {
operand1: 1;
operand2: 1;
add:function(){ // 注意this关键字的用法,this指代当前对象
this.result = this.operand1 +this.operand2;
}
};
calculator.add();
calculator.result();
this是一个关键字,不是变量,也不是属性名。this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。
如果嵌套函数作为方法调用,其this的值指向调用它的对象;如果嵌套函数作为函数调用,其this值不是全局对象(非严格模式)
就是undefined(严格模式)。
var o = { //对象o
m: function(){ //对象中的方法m()
var self = this; //将this的值保存在一个变量中
console.log(this ===0); //输出TRUE,this就是这个对象o
f(); //调用辅助函数f()
function(){ //定义一个嵌套函数
console.log(this === 0); //false:this的值是全局对象或undefined
console.log(self === 0);//true :self指向外部函数的this的值
}
}
};
o.m();
构造函数调用
如果函数或者方法调用之前带有关键字new,它就构成构造函数调用
如果构造函数调用在括号包含一组实参列表,先计算这些实参表达式,然后传入函数内
如果没有形参,构造函数都可以省略括号
var o = new Object();
var o = new Object;
function max(){
var max = Number.NEGATIVE_INDIFITY ;
//遍历实参,查找最大值
for (var i =0;i<argument.length;i++)
if (argument[i]> max )max = argument[i]; //返回最大值
return max;
}
var largest = max(1,10,100,2,3,1000,4,5,10000,6)
自定义函数属性
JS中的函数并不是原始值,而是一种特殊的对象,也就是说函数也可以拥有属性。
初始化函数对象的计数器属性
由于函数声明被提前了,因此这里是可以在函数声明之前给它的成员赋值的
uniqueInteger.counter = 0;
每次调用这个函数都会返回一个不同的整数它使用一个属性来记住下一次将要返回的值
function uniqueInteger(){
returnuniqueInteger.counter++; //先返回计数器的值,然后计数器自增1
}
//计算阶乘,并将结果缓存在函数的属性中
function factorial(n){
if (isFinite(n) && n>0&& n = Math.round(n)) { //有限的正整数
if (!(n infactorial)) //如果没有缓存结果
factorial[n] =n*factorial(n-1); //计算结果并缓存之
returnfactorial[n]; //返回缓存结果
}
else return NaN;
}
factorial[1] = 1;//初始化缓存以保存这种基本情况