JS函数

语法

function 函数名([形参列表]){
执行代码
}
函数名([实参列表])

函数定义

  • 函数声明
    var x=add(2,3);
    function add(number1,number2){
    var sum=number1+number2;
    return sum;
    }

  • 函数表达式
    将匿名函数赋值给变量
    var add= function(number1,number2){
    var sum=number1+number2;
    return sum;
    }
    var x=add(2,3);
    var y=add(2);//实参数量小于形参
    var y=add(2,3,4);//实参数量多于形参

  • 对象实例化(构造函数)
    var add=new Function("i","j",return(i+j));

区别
函数声明的方式定义函数可以在声明前调用,而函数表达式和实例化必须在定义函数后调用
实例化的函数定义方法无法识别父函数的变量
(function(){
var i=10;
var add = new Function("j","console.log(i+j);debugger;")
add(1);})()

2.利用argument进行函数计算
function add(){
var sum =0,parameter;
for(i=0;i<=arguments.length; i++){
parameter = arguments[i];
sum = sum + parameter;
}
return sum;
}
3.参数为原始类型,值传递
function increment(number){
number = number +1;
return number;
}
var a=1;
var x=increment(a);2
a;//1,只传递值,原始值不改变

  • 参数为对象类型,引用传递
    function increment(person){
    person.age=person.age+1;
    return person;
    }
    var jerry={name:"jerry",age:9};
    var x=increment(jerry);
    x;
    jerry;//{name:"jerry",age:10}原始值被改变

作用域

  • 变量起作用的范围


若内部没有相应的作用对象,则会作用到外部


  • 作为对象属性
    var point{
    x:1,
    y:1,
    move:function(stepX,stepY){
    this.x+=stepX;this即指函数作用的对象
    this.y+=stepY;
    }

    point.move(2,1);
    

构造函数

  • 构造函数
    function Point(x,y){
    this.x=x;
    this.y=y;
    this.move=function(stepX,stepY){
    this.x+=stepX;
    this.y+=stepY;
    }
    var point1=new Point(1,1);//{x:1,y:1,move:function(stepX,stepY){}}
    var point2=new Point(1,2);

  • 原型 设置共用的方法函数

function Point(x,y){
    this.x=x;
    this.y=y;
  }
  Point.prototype.move=function(stepX,stepY){
     this.x+=stepX;
     this.y+=stepY;
  }
  var point=new point(1,1);
  point.move(2,1);//x:3,y:2
 function Car(type,color){
    this.type=type;
    this.color=color;
    this.status="stop";
    this.light="off";
  }
  //在原型函数的基础上创建新的方法
  Car.prototype.start=function(){
    this.status="start";
    this.light="on";
    console.log(this.type+"is"+this.status);
  }
 Car.prototype.stop=function(){
    this.status="stop";
    this.light="off";
  }
  var audi=new Car("audi","sliver");
  var benzi=new Car("benzi","black");
  audi.start;//调用方法
  benzi.stop;
  audi.status;//访问属性
  audi.light="off";
  • 构造函数与普通函数的区别
    1.本质上没有区别
    2.构造函数通常会有this指定实例属性,原型对象上通常有一些公共方法
    3.构造函数命名通常首字母大写

函数调用(this)

调用模式

  • 构造函数调用模式

  • 方法调用模式
    audi.start

  • 函数调用模式
    函数调用没有指明特定对象时function(),this指向全局变量即window
    内部方法的子函数无法调用到this
    var myNumber ={
    value:1,
    double: function(){
    var that = this;
    var helper = function(){
    that.value=add(that.value,that.value);
    }
    helper();
    }

  • apply(call)调用模式
    借用其他函数的方法Function.prototype.apply()
    function Point(x,y){
    this.x= x;
    this.y= y;
    }
    Point.prototype.move=function(x,y){
    this.x+=x;
    this.y+=y;
    }
    var p = new Point(0,0);
    p.move(2,2);
    var circle={x=1,y=1,r=1};
    Point.prototype.apply(circle,[2,1]);//x=3,y=2,z=1

     // Function.prototype.bind()
    var circlemove=Point.prototype.bind(circle,2,1);//绑定函数不直接执行
    setTimeout(circlemove,1000);//延迟执行函数
    

函数调用参数

  • Array-like
    arguments[index]
    arguments[length]
  • arguments.callee

递归

  function factorial(i){
      if(i==0){
          return 1;}//递归函数的退出条件
     return i*factorial(i-1);//调用函数本身
  }

闭包

  • 属性隐藏,对象封装
    在函数内部含有子函数,子函数调用了父函数的变量


  • 记忆函数(不懂)
    var factorial=(function(){
    var count=0;
    var fac= function(i){
    count++;
    if(i==0){
    console.log("调用次数"+count);
    return 1;}//递归函数的退出条件
    return i*factorial(i-1);//调用函数本身
    }
    return fac
    })()

    for (var i=0;i<=10;i++){
       console.log(factorial(i));//调用函数
    }
    

First-class function

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

推荐阅读更多精彩内容

  • 函数定义 函数声明 函数表达式 函数实例化 不同函数定义方式的区别: 声明提前:代码执行前先对变量定义、函数声明进...
    angelwgh阅读 282评论 0 0
  • 函数声明和函数表达式有什么区别 (*)解析器会率先读取函数声明,并使其在执行任何代码之前可以访问;函数表达式则必须...
    coolheadedY阅读 383评论 0 1
  • 一.通过关键字 function 定义 1.函数可以通过声明定义,也可以是一个表达式。1)声明:function ...
    小甜妮子__阅读 450评论 0 0
  • 1.中年男子骑着电动三轮车逆行。快到交通路口的时候,发现前方有俩交警。于是第一反应调转车头,谁知迎面而来的摩托车车...
    aftertwelve阅读 137评论 0 0
  • 随着丧尸题材电影愈发的流行,恐怖片的种类也越来越多,这部《釜山行》可以说是一部将恐怖血腥与伦理、人性挂钩的好作品...
    MSJOYCEE阅读 136评论 0 0