javascript函数
javascript函数的参数:
1.形式:其中在函数内部的a叫做形参,而调用函数里的100叫做实参
function(在此处传参){}
fn1(100); function fn1(a){alert(a)};//可以相当于:
fn1(100); function fn1(var a = 100){alert(100)};//但不能这么写
2.也可以传多个参数,如:
fn1(100,"px"); function fn1(a,b){alert(a+b);}
3.参数可以为js的以下数据类型:数字、字符串、布尔值、函数、对象、未定义,网上很多类似的效果就是用函数传参的方式做的
例如:当以对象当参数时有
fn5(window,document);
function fn5(w,d){
w.onload = function(){
d.body.innerHTML=123;
}
};
4.用参数封装一个方法:
function fn1(a){
if(typeof(a) === 'number' && a===a){
alert(a+20);
}else if(typeof(a)==='string'){
alert(a.charAt(2));
}else if(typeof(a)==='function'){
a();
}
}
5.函数传参应用的注意事项:
尽量保证HTML代码结构一致(否则很难重用代码)
需要把核心程序实现,再用函数包裹起来
把每组中不同的值找出来,通过传参分别实现效果
javascript函数返回值:
1.return关键字后面的既是返回值。
2.用函数名+()就可以得到函数的返回值,如:
function fn1(){return 100;};
alert(fn1()); //结果为100
注意:(1)return关键字可以返回字符串、数字、布尔值、函数、对象([]/{}/null)、未定义,如返回字符串就有.length属性等,typeof(fn1());可以判断返回值的类型。
(2)返回函数时,会把这个函数变成字符串返回(包括注释),实际上调用这个函数相当于返回值函数的名字,如:
function fn2(){
return function(){alert(1);};
}
fn2()(); //前面fn2()是fn2的返回值,后面的()代表调用该返回值
3.函数返回值需要注意的事项:
只有函数代码块里才可以用return,如果一个函数没有return或return后无返回值,则会返回一个未定义;
return返回值之后的任何代码都不会执行。
函数返回值
所有函数都有返回值,没有return语句时,默认返回内容为undefined,和其他面向对象的编程语言一样,return语句不会阻止finally子句的执行。
function testFinnally(){
try{
return 2;
}catch(error){
return 1;
}finally{
return 0;
}
}
testFinnally();//0
如果函数调用时在前面加上了new前缀,且返回值不是一个对象,则返回this(该新对象)。
function fn(){
this.a = 2;
return 1;
}
var test = new fn();
console.log(test);//{a:2}
console.log(test.constructor);//fn(){this.a = 2;return 1;}
如果返回值是一个对象,则返回该对象。
function fn(){
this.a = 2;
return {a:1};
}
var test = new fn();
console.log(test);//{a:1}
console.log(test.constructor);//Object() { [native code] }
函数参数
arguments
javascript中的函数定义并未指定函数形参的类型,函数调用也未对传入的实参值做任何类型检查。实际上,javascript函数调用甚至不检查传入形参的个数。
同名形参
在非严格模式下,函数中可以出现同名形参,且只能访问最后出现的该名称的形参。
function add(x,x,x){
return x;
}
console.log(add(1,2,3));//3
而在严格模式下,出现同名形参会抛出语法错误
function add(x,x,x){
'use strict';
return x;
}
console.log(add(1,2,3));//SyntaxError: Duplicate parameter name not allowed in this context
参数个数
当实参比函数声明指定的形参个数要少,剩下的形参都将设置为undefined值
function add(x,y){
console.log(x,y);//1 undefined
}
add(1);
常常使用逻辑或运算符给省略的参数设置一个合理的默认值
function add(x,y){
y = y || 2;
console.log(x,y);//1 2
}
add(1);
[注意]实际上,使用y || 2是不严谨的,显式地设置假值(undefined、null、false、0、-0、”、NaN)也会得到相同的结果。所以应该根据实际场景进行合理设置
当实参比形参个数要多时,剩下的实参没有办法直接获得,需要使用即将提到的arguments对象
javascript中的参数在内部用一个数组表示。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数。在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。arguments对象并不是Array的实例,它是一个类数组对象,可以使用方括号语法访问它的每一个元素
function add(x){
console.log(arguments[0],arguments[1],arguments[2])//1 2 3
return x+1;
}
add(1,2,3);
arguments对象的length属性显示实参的个数,函数的length属性显示形参的个数
function add(x,y){
console.log(arguments.length)//3
return x+1;
}
add(1,2,3);
console.log(add.length);//2
形参只是提供便利,但不是必需的
function add(){
return arguments[0] + arguments[1];
}
console.log(add(1,2));//3
对象参数
当一个函数包含超过3个形参时,要记住调用函数中实参的正确顺序实在让人头疼
function arraycopy(/*array*/from,/*index*/form_start,/*array*/to,/*index*/to_start,/*integer*/length){
//todo
}
通过名/值对的形式来传入参数,这样参数的顺序就无关紧要了。定义函数的时候,传入的实参都写入一个单独的对象之中,在调用的时候传入一个对象,对象中的名/值对是真正需要的实参数据
function easycopy(args){
arraycopy(args.from,args.from_start || 0,args.to,args.to_start || 0, args.length);
}
var a = [1,2,3,4],b =[];
easycopy({from:a,to:b,length:4});