读书笔记,js函数注解

2019-09-03 09:22 来源:未知

练习使用的浏览器IE10    

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
function box(num1,num2){
return num1+num2; //普通函数注明情势
}
alert(box(1,2));

 

var box=function(num1,num2){
return num1+num2; //使用变量开头化函数
}
alert(box(1,2));

  JS 中Function类型实际上是一种对象,每二个函数实际上都是Function类型的三个实例,每一个函数都有部分暗中同意的性质和措施。由于函数是指标,故函数名实际上也是二个针对函数对象的指针变量

var box=new Function('num1','num2','return num1+num2');
alert(box(1,2)); //使用new的构造函数来声称

 

//函数能够传递函数

1、声美赞臣个函数    

//上边包车型大巴事例很平日,不是作为函数来传递的,而是作为函数的重临值来传递的
function box(sum,num){
return sum+num;
}
function sum(num){
return num+10;
}

 

var result=box(sum(10),10); //sum(10)这里传递的是函数的重返值,和常见的变量同样,没不同
alert(result);//30

  直接用关键字function来声称函数,JS是弱类型的语言,评释的时候参数个数不限,只是须要写参数名,不要求写参数的第一字var,无需钦赐重临值以及项目,借使有重返值直接在函数前边二个return value 就能够。

//要把函数本人作为参数字传送递,实际不是函数的结果
function box(sum,num){
return sum(num);
}
function sum(num){
return num+10;
}
var result=box(sum,10);//那几个sum是五个函数,当作参数字传送递到另五个函数里,并非函数的重回值。
alert(return);//20

 

 

  方法一:function func(num1,num2){return 1;}//num1,num2是参数名,再次回到值为1

function box(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);//4*3*2*1=24阶乘,递归
} //使用callee调用自己,达成递归
}
alert(box(4));

 

var color="金黄的"; //这里color正是全局变量,而以此变量又是window的品质

  方法二:利用变量来声称函数,var box=function(num1,num2){};约等于给window对象的自定义属性box注册情势    

var box={
color:"蓝色的",
sayColor:function(){
alert(this.color); //这里的color是box下得属性,也正是局地变量
//这里this,大家规定是表示的box对象
}
}
alert(this.color); //红色的
box.sayColor(); //蓝色的

 

function box(name,age){
return name+age;
}
alert(box.length);

  方法三:利用析构函数来声称,但是最为不要用这种格局来声称,因为这种方法浏览器会剖析五次,成效不高,第三回是分析整个ECMAScript表明式,第三次是深入分析析构函数中传送的字符串列表,var box=new Function('num1','num2','return num1+num2');注意析构函数里面包车型大巴参数以及讲话是蕴涵引号的。这种格局能够更加好的敞亮 Function是三个对象的,函数名是二个指南针的定义

function box(num1,num2){
return num1+num2;
}
办法一: function sum(num1,num2){//apply和call能够改朝换代别的两个函数
return box.apply(this,[num1,num2]);//this表示window成效域,【】表示传递的参数
}

 

方法二: function sum(num1,num2){
return box.apply(this,arguments);//这一个能够当数组传递
}
//alert(box(10,10)); //20
alert(sum(10,10)); //20

2、调用函数    

function box(num1,num2){
return num1+num2;
}

 

function sum(num1,num2){
return box.call(this,num1,num2);//call只是传递参数差别,别的和apply同样
}
alert(sum(10,10));

  方法一中声明的函数间接写函数名就足以调用[fun(10,20)],

var color="红色的";
var box={
color:'蓝色的'
}
function sayColor(){
alert(this.color);
}
sayColor(); //全局
//用call是达成目的冒充,冒充box下,冒充window下
sayColor.call(window); //冒充window红色的
sayColor.call(box); //冒充box,成效域就在box对象里面,所以color正是淡蓝的

 

</script>
</body>
</html>

  方法二和章程三声称的函数调用时用变量名前边加括号内部写上要传送的参数值[box(10,20)];    

 

  函数的重临值能够一贯赋值给四个变量[var box=func(20,10);],也足以看作实参直接传送给别的的函数[alert(func(10,20));]    

 

  ECMAScript 中的函数名自个儿便是变量,所以函数也能够视作值来使用。也等于说,不仅可以够像传递参数同样把八个函数字传送递给另贰个函数, 何况可以将四个函数作为另叁个函数的结果回到      

 

 

//将二个函数作为结果回到   其实就一定于执行那几个函数,然后把这一个函数的重回值给再次来到

    function sum(num1,num2){

        return num1+num2;

    }

    function func(num1){

        return sum(num1,10);

    }

    alert(func(10));//20

 

 

//其实函数名,也正是贰个目的的变量,施行的是函数的地点,也正是三个指南针

//将函数名当做七个参数字传送递给别的一个函数,

    function sumFunc(num1,num2){

        return num1+num2;

    }

    function func(sum,num1){

        return sum(num1,10);

    }

    alert(func(sumFunc,10));//20

 

 

  JS 中并未有函数重载的传教,函数调用的时候,会以左右原则来调用    

 

  JS 中调用函数的时候允许调用者和被调用那的参数个数区别,也不会报错,可是一旦参数个数非常不足的话,在实行时因为部分参数没有赋值或然会报错,参数时在此以前向后对应传递接收的

 

3、函数的在那之中属性 arguments    

 

  arguments 是三个类数组,用来保存函数字传送递过来的参数,数组类型    

 

  在申明函数的时候,一时大家并不知道调用者到底要传送多少个参数过来,比如说,求一串数的丰裕和,如果调用者不是用数组传递过来而是用直白传送给函数的章程传送[func(10,20...)],那么在宣称函数实体的时候就不领会要注明多少个参数,那时能够不写参数名,在函数内部用arguments来代表,arguments是二个类数组,保存的是有着那几个目的的函数的参数的值,用索引的秘技不只能拿走相应的参数的值,使用如下:      

 

 

function func(){

        var res=0;

        for(var i=0;i<arguments.length;i++){

            res+=arguments[i]+" | ";

        }

        return res;

    }

 

    alert(func(20,30,40));

   arguments 中还大概有一个很关键的性质便是callee,是三个指针变量,指向的是兼具那个arguments类数组的函数,其实也正是arguments所在的函数本身,在递归的时候最佳用那一个性情,因为倘诺函数名转移了,也无需退换内部的落实,arguments.callee()始终表示的是以此函数本人 

 

//用arguments.callee的功利是,当函数名改成了今后,不须要改变递归出的函数,

    function box(num){

        if(num<=1){

            return 1;

        }else{

            return num*arguments.callee(num-1);

            //arguments.callee代表的是函数的自家,故和地点是均等的效应

        }

    }

    alert(box(3));//6

 4、函数的内部属性 this    

 

  this 那个性子代表的是它所在的对象自己,和C#中this代表实体对象自己是一律的,this 援引的是函数以举行操作的对象,可能说函数调用语句所处的极度效能域    

 

  window是JS中最大的二个对象,在window对象中声称四个变量其实正是给window这一个目的声喜宝(Hipp)个性能,var box=1;约等于 window.box=1;也就等价于this.box=1;    

 

  当在大局功用域中调用函数时,this 对象援引的正是 window。    

 

  在展现的宣示三个对象box,那些box中央银行使的this就代表的是box本人,this.color正是回到的box中质量color的值,而不是window对象中color的值  

 

// this 代表的是坐在的对象自己,下边在目的box中的this,就代表对象box

    var color='群青'; // window对象的属性,

     

    var box={

        color:'蓝色',

        run:function(){

            alert(this.color);//蓝色

            return this.color;

        }

    }

    alert(window.color);//红色

    alert(this.color);  //石黄    此处this代表的是window对象,故this.color是意味的window的习性

    alert(box.run());   //蓝色

 

    window.co='hh';     //和地方的color是等价的,都属于window对象的属性

    alert(this.co);

 5、函数的天性 length    

 

  函数的天性length代表的是函数希望接受的参数的个数,是由声明函数时参数列表中的个数调控的

 

6、函数的性质 prototype  

 

  prototype 是保存全数实例方法的的确所在,也正是原型。  

 

  prototype 下边有五个章程apply(),call(),那么些措施都以函数非承接而来的点子,  是每三个函数都负有的主意。那三个格局的用途都以在特定的功效域中调用函数,也正是说调用特定的对象上面调用函数,(当然那一个目的不自然已经宣称有这一个艺术),实际上相当于等价于设置函数内部this对象的值,有一点点类似于C#的反光中调用对象的办法。  

 

  func.apply():这么些法子有多少个参数,第三个是要试行那几个办法的效用域,相当于传递贰个目的过去,第贰个参数是四个数组,这一个数组中是寄存的调用的函数func的实参,也便是要传送给func的值,当然第1个参数能够简简单单。func.apply(this, [num1, num2]);。倘使是在一个函数中调用能够用arguments把那些函数的参数字传送递过去,前提是其一类数组中有参数。但是最佳是确认保证这一个类数组中存放的是您想要传递给func函数的实参的值。固然个数不匹配也不会出错,可是事情上大概不对  

 

  func.call():这么些情势和方面的apply()方法是一样的,分歧的是参数,第叁个同样是功用域,是同一的,别的的参数是直接传送给函数的,并非传递三个数组过去。正是说传递的参数顺序和艺术是遵纪守法常规调用函数的花样和方式。func.call(this, num1, num2);    

 

  那四个法子最要害的功用是是能力所能达到庞大函数赖以运维的效能域,也正是改造函数运营所在的功用域      

 

  使用这apply()和call()那三个法子来扩大成效域最大的补益是目的没有要求与艺术发生任何的耦合关系,相当于上边说的目的中也许不设有那个格局,但假设存在那么些指标就OK。【耦合:关联的情趣,修改和维护会产生连锁反应】。也正是说 box 对象和sayColor()方法之间不会有盈余的涉嫌操作,举例 box.sayColor = sayColor;[ box对象中没有供给出示写上那条语句,也能够经过sayColor.call(box,'red')恐怕apply来调用方法sayColor,况且调用时sayColor方法的功能域是在指标box内部 ].

 

 

 

//call()和apply()方法最重视的是用于扩充函数正视的成效域

 

var color='red';

var box={

    color:'green'

}

 

function sayColor(){

    return this.color;

}

 

alert(sayColor());          //red       对象是window

alert(sayColor.call(this));     //red       对象是window

alert(sayColor.apply(this));            //red       对象是window

alert(sayColor.call(window));   //red       对象是window

alert(sayColor.apply(window));  //red       对象是window

alert(sayColor.call(box));      //green     对象是box

alert(sayColor.apply(box));     //green     对象是box

 

JS 中Function类型实际上是一种对象,每贰个函数实际上都是Function类型的三个实例,每叁个函数皆有一部分默许的性子和...

TAG标签:
版权声明:本文由990888藏宝阁发布于前端代码,转载请注明出处:读书笔记,js函数注解