JS函数
来自CloudWiki
目录
函数的定义
JS函数是通过function关键词定义的
函数的声明和使用
function print(s){ console.log(s); }//声明 print(123);//调用
javascript提升(hoisting)
提升(Hoisting)是 JavaScript 将声明移至顶部的默认行为。即可以在使用变量之后对其进行声明,换句话说,可以在声明变量之前使用它。
以下代码例1中的代码作用是相同的。
print(123);//调用 function print(s){ console.log(s); }//声明
变量赋值
例2:
var print=function(s){ console.log(s); } print(123);
注意,此种方法中,则不可以在声明变量之前使用它。
函数名重复
例3:
function print(s){ console.log(s); } function print(s){ console.log(s+100); //函数名重复,该函数会覆盖上一个函数。 } // print(123);
函数参数和函数返回
JavaScript 函数通过 function 关键词进行定义,其后是函数名和括号 ()。
函数名可包含字母、数字、下划线和美元符号(规则与变量名相同)。
圆括号可包括由逗号分隔的参数,由函数执行的代码被放置在花括号中:{}
function name(参数1,参数2,参数3){ 要执行的代码 }
当 JavaScript 到达 return 语句,函数将停止执行。
如果函数被某条语句调用,JavaScript 将在调用语句之后“返回”执行代码。
函数通常会计算出返回值。这个返回值会返回给调用者
function add(x,y){ console.log(x+y); } function add2(x,y){ return(x+y); } var r1=add(2,3); //没有返回值 var r2=add2(2,2); console.log(r1,r2);
函数的属性
函数名属性
例1:
function f1() {} f1(); //函数名为f1 console.log(f1.name); var f2=function Name(){} //真正的函数名为f2,Name只在函数体内部使用 console.log(f2.name)
函数length属性
例2:
function f3(a,b){} console.log(f3.length); //返回f3函数参数的个数
函数toString属性
例3:
function f3(a,b) { return a+b; } console.log(f3.toString());//将以上函数代码(包括注释)以字符串格式输出
函数的参数
例1
js函数对参数没有严格的限制,参数是可以省略的。
function func(a,b){ return a; //b is undefined } console.log(func(2));//只传了一个值,即a=2
例2:参数传值
//传值传递 passed by value var p=2;//实际参数,可以在函数外部使用 function func(a){ a=a+5;//形式参数,只能在函数内部使用 return a; } console.log(p,func(p));
//传址传递 passed by reference var obj={p:1}; function func(a){ a.p=5; return a; } console.log(func(obj));
传值传递是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。
传址传递时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。
函数作用域
例1:全局变量和局部变量
var a=2; //全局变量a var x=function func() { var a=3;//函数的局部变量a console.log('x函数的a->',a); } console.log('全局变量的a->',a); x();
例2:x函数没有在本地找到a的值,于是到上一层定义的x函数中寻找a
var a=2; var x=function func() { console.log('x函数的a->',a); }//函数没有在本地找到a的值,于是到外层寻找到全局变量a function y(){ var a=3; x(); }//x函数没有在本地找到a的值,于是到上一层定义的x函数中寻找a console.log('全局变量的a->',a); x(); y();
例3:如果直接用参数传值到x函数,则优先用参数中的a
var a=2; var x=function func(a) { console.log('x函数的a->',a); //a1(x)=a=2 } function y(){ var a=3; x(a);//a2=a(y)=3 } console.log('全局变量的a->',a); x(a); y();