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();