JS函数

来源:互联网 发布:股票抢单软件 编辑:程序博客网 时间:2024/06/03 14:40

JS函数

1 函数的概念

案例:判断100以内所有素数

方案一:循环的嵌套

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

这种解决方案程序比较复杂, 阅读也比较麻烦,需要比较高超的技术

方案二:运用函数:

for(var n=2; n<=100; n++){
 if(isPrime(n)){
     document.write(n+"<br/>");
      }
}
function isPrime(x) {
    var m =Math.ceil(Math.sqrt(n));
    var found = false;
    for(var i =2; i<m; i++){
        if(n%i==0){
            return false;
        }
    }
    return true;
}

这种解决方案,将一个比较复杂的问题分为两个比较简单的问题去解决,是用“量”去克服“难”和“大”的问题。也就是大事化小。

这种解决方案给我们提供了一个解决规模大、难度大的额问题的解决思路:他分解为多个规模相对较小、难度相对较低的问题去解决,如果分析后的问题依然规模大或者难度高,可以按照这个思路一直分解下去,直到分解后的问题足够小、简单。归纳起来就是“大事化小”。

2定义和调用

定义:

function  idPrime(n){
                ……

}

function isJiaogu(){函数头

     函数体

}

Function定义函数的关键字

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

n 形式参数(形参)。

idPrime(12),12就是实际参数(实参)。

函数头部:体现的是函数的设计。

函数体:体现的是函数实现的过程。

设计比实现更加重要。

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

var flag = true;
for(var n=2; n<100; n++){
    if(!isJiaogu(n)){
        document.write("角谷定理验证失败");
    }
}
alert("角谷定理验证"+(flag?"成功":"失败"));
/*
 * 判断一个给定的数,是否符合角谷定理。
 * 名称isJiaogu
 * 输入参数:待判断的数
 * 输出结果:true、false
 * */
function isJiaogu(n) {
    while(n !=1){
        if(n%2==0){
            n /= 2;
        }else{
            n = n * 3 + 1;
        }
    }
    return true;
}

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

任意一个大于6的偶数,都可以分解成两个质数之和

一个函数能帮我们判断大于6的偶数能否分解的

设计一下该函数

如果系统中有判断一个数等于两个素数和的函数。

var flag = true;
for(var n=6 ;n<10000;n+=2){
    if(!canSplit(n)){
        flag = false;
         break;
    }
}
alert("哥德巴赫猜想"+(flag?"成功":"失败"));

功能:

判断一个数能否分解为两个素数之和

名称:canSplit

输入参数值:待分解的数

返回结果:true/false

function canSplit(n){
    for(var a=2; a<=n/2; a++){
        if(isPrime(a) && isPrime(n-a)){
            return true;
        }
    }
    return false;

二那么如何实现这个函数呢,好像还是不够简单,那么我们继续划分如果系统有一个可以判断素数的函数,那么这个问题也简单设计:

功能:isPrime                   (n)形参

输入参数:带判断的数

输出结果:true/false

function isPrime(n) {
    var m =Math.ceil(Math.sqrt(n));
    var found = false;
    for(var i =2; i<m; i++){
        if(n%i==0){
            return false;
        }
    }
    return true;
}

函数的本质:直观的理解就是实现某个独立功能的代码段,或者说它就是一个数据加工的黑箱子。

 输入参数 →函数名 → 输出结果                 

函数名就相当于黑箱子

所谓“黑箱子”,就是我们只关心外面的东西,比方说他是干的,需要输入什么,可以得到什么结果,而不关心里面是怎么工作的。

忽略实现细节。

3参数传递

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

参数传递有两种方式:

值传递和引用传递(地址传递)

<script>
    var a =5;
    increase(a);
    alert(a);
    function increase(x) {
        x++;
    }
</script>

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

    /*引用传递*/
    var a = new Object();
    a.value = 5;
    increase(a);
    alert(a.value);
    function increase(x) {
        x.value++;
    }
</script>

a.value没有被显示修改,但是我们发现a.value确实是加1了因为x就是a,或者说x是a的别名,专业一点就叫做引用。

常规类型的参数采用的是值传递,比如Number、String、Boolean。

对象类型的参数采用的是引用类型,比如Object.。

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

4变量作用域

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

<script>
    function localVar() {
        var a =1;
        alert(a);
    }
    localVar();
    alert(a);
</script>

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

<script>
    function localAllVar() {
       a = 1;
    }
    function test() {
        aleret(a);
    }
    localAllVar();
    alert(a);
</script>

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

<script>
    var a =1;
    function allVar(){
        alert(a);
    }
    allVar();
</script>

冲突处理规则:就近原则。

<script>
    var a =1;
    function doubleVar(){
        var a =2;
        var a =3;
        alert(a);
    }
    doubleVar();
</script>

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

<script>
    var a =1;
    function doubleVar(){
        var a =2;
        var a =3;
        alert(window.a);
    }
    doubleVar();
</script>

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

要理解就近原则,而不是从上到下。

<script>
    var a =1;
    function test() {
        var  a =2;
        var  a =3;
        alert(a);
    }
    test();
    alert(a);
</script>

原创粉丝点击