您的位置:首页 > Web前端 > JavaScript

js中的函数基础

2017-08-01 20:41 190 查看
1.函数的概念

为什么需要用函数?

方案一:循环的嵌套

for(var
num
=2;
num<100;
num++){
  
var
m
= Math.ceil(Math.sqrt(num));
  
varfound
= false;
  
for(i=2;
i<=m;
i++){
      
if
(num%i
==0){
       
found=
true;
       
break;
      
}
}
/*alert(found?"是素数":"不是素数");*/
 
if(!found){
   
document.write(num+"是素数<br>");
 
}
}

这种解决方案程序比较复杂,阅读比较困难,需要比较高超的技术。

方案二:应用函数

for(var
n
=2;
n<=100;
n++){
   
if(isPrime(n)){
       
document.write(n+"<br>");
   
}
}
function
isPrime(n){
   
var
m
= Math.ceil(Math.sqrt(n));//根据数学定理,判断范围可缩小至[2,sqrt(n)]
   
var
found
= false;//找到因子的标记
   
for(vari=2;
i<=m;
i++){
       
if(n%
i
== 0){
           
returnfalse;
       
}
   
}
   
return true;
}

2.定义与调用

函数是什么?怎么用?

定义:

function isPrime(n){

……

}

function是定义函数的关键字

isPrime是函数的名字,和变量名一样的命名规则和原则

n形式参数(形参)

函数调用:isPrime(12),12就是实际参数(实参)

函数头部,体现的是函数的设计

函数体,体现的是函数的实现过程

设计比实现更重要

案例:验证100以内的数都符合角谷定理

var
flag
=
true;
for(varn=2;
n<=100;
n++){
    if(!isJiaogu){
        flag=
false;
break;
    }

}
alert("角谷定理验证"+(flag?"成功":"失败"));
function isJiaogu(n){
    while(n!=
1){
        if(n%
2 == 0){
            n / 2;
        }else{
            n = n*3+1;
        }
    }
    returntrue;
}

案例:验证10000以内哥德巴赫猜想成立

varflag
=
true;
for(n=6;
n<=10000;
n+=2){
    if(!canSplit(n)){
        flag=
false;
        break;
    }

}
alert("哥德巴赫猜想验证"+(flag?"成功":"失败"));
functioncanSplit(n){
    for(var
a=2;
a<=n/2;
a++){
        if(isPrime(a) &&
isPrime(n-a)){
            returntrue;
        }
    }
    returnfalse;
}
function isPrime(n){
    var m
= Math.ceil(Math.sqrt(n));//根据数学定理,判断范围可缩小至[2,sqrt(n)]
    var
found =
false;//找到因子的标记
    for(vari=2;
i<=m;
i++){
        if(n%
i == 0){
            return false;
        }
    }
    returntrue;
}

3.参数传递

所谓参数传递,就是将实参的值传递给形参。通过调试可以确定形参在函数调用之前是不存在的,当函数被调用的那一刻,实参被创建,并且把实参的内容传递给形参。

参数传递有两种方式:值传递和引用传递

值传递:

vara
=
5;
increase(a);
alert(a);
function increase(x){
    x++;
}

a的值并没有显示预期中的6,还是5。因为形参x和实参a是两个不同的变量,x的变化和a没有任何关系。

引用传递:

vara
=
new Object();
a.value
= 5;
increase(a);
alert(a.value);
function increase(x){
    x.value++;
}

a.value没有被显示修改,但是a.value确实是加了1,因为x就是a,或者说x是a的别名,专业一点就叫引用。
常规类型的参数采用的是值传递,比如Number,String,Boolean

对象类型采用的是引用传递,Object。

如果希望把参数从函数中带出来,但是函数的返回值只有一个

4.变量作用域

局部变量:在函数内部定义的变量,这个变量只能够在函数的内部使用,在全局中不能使用。比如在三国时期,袁术称帝后,只有袁术阵营的人才认为他是皇帝,他发布的命令只有在本阵营里面起作用,但是其他人不认为他是皇帝,他发布的命令没有作用。

function
localVar(){            

    var a
= 1;
    alert(a);
}
localVar();
alert(a);

在函数内部定义一个变量,如果没有加上var,那么这个变量被认作为全局变量。

functionlocalAllVar(){
    a
=1;
}
function test(){
    alert(a);
}
localAllVar();
test();

全局变量:在函数外部定义的变量,这个变量可以在全局中进行使用。比如汉朝皇帝发布了命令,那么不管是袁术还是曹操都要听这个命令。

vara
=
1;
function allVar(){
    alert(a);
}
allVar();

冲突处理原则:就近原则,不是从上到下

在函数中定义了一个和全局变量名相同的变量,此时在函数中在定义前使用,那么这个变量还是函数中的变量,undefined,不使用全局变量。

vara
=
1;
function doubleVar(){
    var a
= 2;
    vara
= 3;//就近原则
    alert(a);
}
doubleVar();

局部和全局同时定义了一个相同名字的变量时如何在局部里面访问全局变量?在局部中给变量加上window的前缀,就可以访问到全局的变量。

vara
=
1;
function doubleVar(){
   var
a=
2;
    vara
= 3;

    alert(window.a);
}
doubleVar();


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息