基本概念--函数

1.函数的定义

1.1函数语句

案例一 这个案例没有return ,这个函数返回的是 undefined

let o={

            x:1,

            y:2,

            z:3

        }

        function printprops(o){

            for(let p in o){

                console.log(`${p} : ${o[p]}`)

            }

        }

       console.log(printprops(o));

案例二 计算两个笛卡尔坐标(x1,y1)和(x2,y2)之间的距离,  这个函数返回的是Math.sqrt(dx*dx+dy*dy)

       function distance(x1,y1,x2,y2){

           let dx=x1-x2;

           let dy=y1-y2;

           //Math.sqrt() 函数返回一个数的平方根

           return Math.sqrt(dx*dx+dy*dy)

       }

       console.log(distance(5,7,7,9))

计算阶乘的递归函数(调用自身的函数)

x!的值是从x到x递减的值的累乘

比如x为4  最后的结果4*3*2*1

       function factorial(x){

           if(x<=1){

               return 1;

           }else{

               return x*factorial(x-1);

           }


       }

       console.log(factorial(4));

1.2函数表达式

        let squary=function(x){

            return x*x;

        }

        //函数表达式可以包含名称,这在递归时很有用

        let f=function fact(x){

            if(x<=1){

                return 1;

            }else{

                return x*fact(x-1)

            }

        }

       console.log(f(5));//120

       //函数也可以作为参数传给其他函数

       let data=[5,100,367,293,31,20];

       data.sort(function(a,b){

           return a-b;

       })

       console.log(data);//[5, 20, 31, 100, 293, 367]

       //函数表达式有时定义后立即调用

       let tensquared=(function(x){

           return x*x;

       })(13);

       console.log(tensquared);//169

2.函数命名规则

2.1嵌套函数,在js中函数可以嵌套在其他函数中,内嵌的函数不能出现在循环,条件判断

function hypotenuse(a,b){

          function  square(x){

              return x*x;

          }

          return Math.sqrt(square(a)+square(b))

      }

      console.log(hypotenuse(5,5));

3.函数调用

四种方式可以来调用js函数

● 作为函数

● 作为方法

● 作为构造函数

● 通过它们的call() 和apply()的方式调用

3.1作为函数

let o={

            x:1,

            y:2,

            z:3

        }

        function printprops(o){

            for(let p in o){

                console.log(`${p} : ${o[p]}`)

            }

        }

       console.log(printprops(o));

3.2作为方法调用

 var o = {

        method: function () {

            console.log(1)

        }

       }

       o.method();

注●如果嵌套函数作为函数调用,其this值不是全局对象(非严格模式)就是undefined(严格模式)

  let o={

             m:function(){

                 var self=this;

                 console.log(this==o);

                 f();

                 function f(){

                     console.log(this);//false  window undefined

                     console.log(self==o);//true

                 }

             }

         }

         o.m()

3.3 作为构造函数调用

如果函数和方法调用之前加关键字new,它就构成了构造函数

let o=new Object();     let o=new Object;

3.4通过它们的call() 和apply()的方式调用

改变this指向 下面的案例this指向了sum

call和apply()区别是传递的参数不同

function add(c,d){

         console.log(this)

         return this.a+this.b+c+d;

     }

     let sum={

         a:1,

         b:2

     }

     let res= add.call(sum, 10, 2);//this 的指向是sum

     console.log(res);

     let res1=add.apply(sum,[20,21]);//44 this 的指向是sum

     console.log(res1)

4.函数的实参和形参

4.1.可选形参 当调用函数的时候传入的实参比函数声明时指定的参数个数要少,剩下的形参都将设置为 undefined

function getPropertyNames(o,a){

   a= (a == undefined) ? []:a;

    for(let item in o){

        a.push(item)

    }

    return  a;

}

let o={

    x:1,

    y:2,

    z:3

}

let p={

    q:4

}

let res=getPropertyNames(o);

console.log(res);// ['x', 'y', 'z']

let res1=getPropertyNames(p,res);

console.log(res1);//['x', 'y', 'z', 'q']

4.2可变的实参列表:实参对象

可以通过arguments获取实参的个数

function f(x,y,z){

    console.log(arguments.length);

}

f(1,2)

callee 和 caller 可以通过callee 递归的调用自身

function f(x,y,z){

    console.log(arguments.callee);//

}

f(1,2);

将对象的属性作为实参

function arraycopy(from,form_start,to,to_end){

console.log(from,form_start,to,to_end)

}

function easycopy(obj){

    arraycopy(obj.form,obj.form_start,obj.to,obj.to_end)

}

easycopy({form:'a',form_start:'b',to:'c',to_end:'d'});

5 作为值的函数

作为值的函数

function square(x){

    return x*x;

}

let s=square;

square(2);//4

s(2);//4

//案例二
function add(x,y){

    return x+y;

}

function substrac(x,y){

    return x-y;

}

function mutiplay(x,y){

    return x*y

}

function divide(x,y){

    return x/y

}

function operate(operator,operand1,operand2){

    return operator(operand1,operand2);

}

console.log(operate(add,operate(add,2,3),operate(mutiplay,3,4)));//17

6.闭包

当一个函数嵌套另外一个函数,外部函数将嵌套的函数对象作为函数值返回,这就是闭包
let scope='global scope';

function checkscope(){

    let scope='local scope';

    function f(){

        return scope;

    }

    return f();

}

console.log(checkscope());//local scope

function counter(){

    let n=0;

    return{

        count:function(){ return n++; },

        reset:function(){ n=0; }

    }

}

var c=counter();

var d=counter();

console.log(c.count());//0

console.log(d.count());//0

console.log(c.reset());

console.log(c.count());//0

console.log(d.count());//1

ss

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容