/**
* js函数
* 赋值给一个变量
* 作为一个对象的属性
* 作为其他函数的参数
* 作为其他函数的返回值
*/
//函数是一个独立的对象
function f(){
return "function f() body";
};
f.id = "fid";
f.name = "fname";
//alert(f);
//alert(f());
//alert(f.id+":"+f.name);
//函数的参数
//无论传多或少于函数的参数个数,都能正常执行函数。当小于函数形式参数个数时,其他形式参数为undefined,多余时舍弃
function param(a,b,type){
if(a ===undefined){
alert("func not hava a arg");
return false;
}else{
if(b ===undefined){
alert("second arg not in");
return false;
};
if (type ===undefined){
alert("third arg not in");
return false;
};
switch(type){
case "a": return a+b; break;
case "s": return a-b; break;
case "m": return a*b; break;
case "d": return a/b; break;
default:return "Error Type Param"; break;
}
};
}
//alert(param.length); //函数的参数个数
//alert(param());
//alert(param(2));
//alert(param(5,2));
//alert(param(5,2,"a"));
//alert(param(5,2,"c",7));
//当函数没有形式参数,可使用arguments
function sum(){
var result = 0;
for(var i = 0,len = arguments.length;i<len;i++){
if(isNaN(arguments[i])){ //不为数字
throw new Error("arg "+arguments[i]+" is not a number");
}else{
result += arguments[i];
}
}
return result;
}
//alert(sum(4,15,3,65,22));
//alert(sum(4,25,3,"b",22));
//函数作用域
//变量分为全局变量(在所有函数之外声明的变量)和局部变量(函数内部声明的变量)
//函数被js解释器装载时,会对函数的参数和局部变量进行初始化,当某对象在函数中被调用时
//会先在函数的对象作用域中找,没有时才找全局作用域对象(全局变量就是全局对象window的属性)
var strSp = "fullVar";
function strFunc(){
alert(strSp); //undefined
var strSp = "localVar"; //localVar
return strSp;
}
//alert(strFunc()); //程序分析:strSp在函数中被调用(不会调用全局对象strSp),而strSp没有赋值所以undefined(对象不赋值默认初始化为undefined)
//函数上下文
//函数是独立的对象,可以作为其他任意对象的方法,所以函数中this是可变的
//使用call和apply传入函数的上下文
var objCon1 = {
name:"Dog",
age:3
};
var objCon2 = {
name:"Cat",
age:2
}
function getName(){
return this.name;
};
//alert(getName.call(objCon1));
//alert(getName.apply(objCon2));
//函数的使用
//1、赋给一个变量
function addFunc(a,b){
return a+b;
}
var useObj = addFunc;
//alert(useObj(3,5));
//2、作为一个对象的属性
var obj = {
message:addFunc
};
//alert(obj.message(6,5));
//3、作为其他函数的参数
function subFunc(str,len){
return
str.substring(0,len);
}
function outFunc(str,len,func){
return func(str,len);
}
//alert(outFunc("abcdefg",4,subFunc));
//4、作为其他函数的返回值
function showMessage(){
return function(){
alert("inside showmessage");
}
}
alert(typeof showMessage());//showMessage()返回的是一个函数对象
showMessage()();
//5、匿名自执行函数(定义后立即执行)
var data = {a:"3",b:"6"};
(function(obj){alert(obj.a*obj.b);})(data);//第一个()返回函数对象,第二个()立刻执行函数(可传入参数)