JavaScript笔记-3

函数

返回值

  • return关键字会立即结束函数并返回一个特定的值
  • 没有明确指定return,将会返回undefined

引用调用

  • 引用

    函数名后没有圆括号,仅仅是引用这个函数

    • 可以吧一个函数赋值给一个变量、一个对象的属性,添加到数组里面

      function getStr(){...}
      
      //赋值给变量
      const f = getStr ;
      f() ;   //执行getStr()
      
      //赋值给一个对象的属性
      const obj = {} ;
      obj.f = getStr ;
      obj.f() ;   //执行getStr()
      
      //添加到数组里
      const arr = [] ;
      arr[0] = getStr ;
      arr[0]() ;  //执行getStr()
      
  • 调用

    函数名后面有圆括号,调用它,并执行函数体

函数参数

  • 参数:函数调用结束后就不再存在的变量

  • 形参

    在函数中给形参赋值,不会影响函数外相同名字的变量。

    let a = 'abc';
    
    function fun(a) {
      
      console.log(`函数内修改前,a=${a}`);
      //函数内修改变量a的值
      a = 'xyz';  
      console.log(`函数内修改后,a=${a}`);
      
    }
    
    console.log(`调用函数前,a=${a}`); //"函数内修改后,a=xyz"
    
    fun(a); //"调用函数前,a=abc"
                  //"函数内修改前,a=abc"
    
    console.log(`调用函数后,a=${a}`); //"调用函数后,a=abc"
    

但是会影响一个对象类型的变量

const obj = {} ; 

function fun(obj){
  
  obj.number = 1 ;
  obj.color = 'blue' ;
  
  //下面这段是为了证明函数内obj和函数外的obj完全不同
  //并非是代码第1行,const声明obj的原因
  //此处是一个全新的、独立的对象,有别于函数外obj
  obj = {date: 'sun'} ;
  
}

fun(obj) ;//调用函数

obj;  //{number:1, color:'blue'}
obj.date; //undefined
  • 实参:形参被赋值后变成实参

解构参数

  • 解构赋值中,参数属性名必须是字符串标识符

  • 传入对象不存在与参数属性名相匹配的,该属性将接受一个undefined值

    function fun ({$, a, b, c, x}){
                console.log(`${$+a+b+c+x}`) ;
            }
    
    const obj = {
      $: '你好' ,
      a: 'hello ' ,
      b: ' world ' ,
      c: ' !' ,
      d: '*#~'
    }
    fun(obj) ;    //"你好hello  world  !undefined"
    
  • 可以解构数组

  • 可以使用展开操作符收集多出来的参数,但必须是最后一参数前使用。

    function fun([name, age, ... last]){
                console.log(`${name} is ${age}'s old .`) ;
                console.log(last) ;
            }
    
    const arr = [
      'Tom' ,
      34 ,
      'red' ,
      'USA'
    ] ;
    
    fun(arr) ;  // Tom is 34's old .
                          // ["red", "USA"]
    

默认参数(ES6)

  • ES6新特性,可以指定参数的默认值

    function fun(a = 998, b = 'hello', c = false) {
                console.log(`a is ${typeof a}, and a=${a}`);
                console.log(`b is ${typeof b}, and b=${b}`);
                console.log(`c is ${typeof c}, and c=${c}`);
            }
    
    fun(1, 'duang!', {});//a is number, and a=1
                         // b is string, and b=duang!
                         // c is object, and c=[object Object]
    
    
    fun(1, 'duang!');// a is number, and a=1
                     // b is string, and b=duang!
                     // c is boolean, and c=false
    
    
    fun(1);// a is number, and a=1
           // b is string, and b=hello
           // c is boolean, and c=false
    
    
    fun();// a is number, and a=998
          // b is string, and b=hello
          // c is boolean, and c=false
    

函数作为对象属性

通常称为方法,从而和一般函数区分开来

//初始化的时候添加方法
const obj = {
  fun : function(){return 0 ;} 
};

//ES6新的快捷语法
const obj = {
  fun(){return 0 ;}
};

this关键字

  • 通常与面相对象变成一起出现

  • 通常关联作为对象属性的函数,方法被调用是,this就是被调用的对象

    const obj = {
      color: 'green' ,
      
      getColor(){
        console.log(this.color) ;
      }
      
    };
    
    obj.getColor() ;//green
    
  • this是由方法如何被调用决定的,而非函数定义所决定。

    //继续上一段obj代码
    const a ={
      color: '这里是a的color' ,
    }
    
    a.getColor = obj.getColor ;
    
    a.getColor() ;//这里是a的color
    
  • 嵌套函数中访问this,为了避免错误,将this赋值给一个变量

    const obj = {
      
          number : 100 ,
          getNumber(){
                //将this赋值给一个变量。
                let self = this ;
    
                function count(){
    
                      return self.number - 1 ;
    
                }
    
                console.log(`${obj.number}-1=${count()}`) ;
          }
      
    };
    
    obj.getNumber() ;
    

匿名函数和函数表达式

把一个具名的函数赋值给一个变量,变量名具有较高优先级.

箭头符号(ES6)

简化语法,适用于创建或传递一个匿名函数时使用

  • 可以省略function这个单词

  • 函数只有一个参数,可以省略括号

  • 函数体是一个单独的表达式,可以省略花括号和返回语句

    const a = num => console.log(num) ;
    
    const fun = () => console.log('hello') ;
    
  • 区别

    • this是跟语句绑定的

      const obj = {
          name: 'Tom' ,
          fun1: function(){
      
              function newName(){
                  this.name = 'Bob' ;        
              }
      
              newName();
          }   
      };
      
      obj.fun1() ;
      console.log(obj.name) ;//Tom
      
      //箭头函数
      const obj = {
          name: 'Tom' ,
          fun1: function(){
            
              const newName = () => {
                    this.name = 'Bob' ;
              }
              
              newName();
         }
       
      };
      
      obj.fun1() ;
      console.log(obj.name) ;//Bob
      
  • 不能当做对象构造器

  • 指定的参数在箭头函数中不生效

调用、请求和绑定

  • .call()方法允许使用指定的this来调用函数,所有函数都可以使用

    .call(想要绑定的值, 调用函数的参数1,调用函数的参数2)

    const a = {string: 'hello'} ;
    function fun1(){
        console.log(this.string) ;
    }
    fun1.call(a) ;//hello
    
    function fun2(name, birthYear){
        this.name = name ;
        this.birthYear = birthYear ;
        console.log(this) ;
    }
    fun2.call(a, 'Tom', '1998') ;//{string: "hello", name: "Tom", birthYear: "1998"}
    
  • .apply()方法与call方法基本一致,不同的是以数组得方法获取参数,经典例子就是求数组最大最小值

    //承接上段代码的 a , fun2() ;
    const arr = ['SB', '2046'] ;
    fun2.apply(a, arr) ;//{string: "hello", name: "SB", birthYear: "2046"}
    
    //求数组最大,最小值
    const numbers = [2, 3, 13, 343, 0, 34, 3] ;
    let maxNum = Math.max.apply(null, numbers) ;//343
    let minNum = Math.min.apply(null, numbers) ;//0
    
  • 通过ES6展开操作符(…),可以实现apply同样的功能

    //承接上段代码
    fun2.call(a,...arr) ;//等价于fun2.apply(a,arr) ;
    maxNum = Math.max(...numbers) ;//不关心this,可直接用展开操作符条用函数
    minNum = Math.min(...numbers) ;
    
  • .bind方法可以给函数永久的绑定this值

    调用bind方法也可以传参数

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

推荐阅读更多精彩内容

  • 一个公开透明,记录所有交易的账本,是区块链如此与众不同、自带信任体系的根本原因。 因为区块链的分布式特性,人手一份...
    李白起不来阅读 843评论 0 2
  • 今天下午原本约好去中医诊所,有点事,顺便做个理疗。因前一天约好了,所以就没再确认。可是到了地方,空无一人。于是电话...
    小自班048明诗阅读 4,380评论 0 1
  • 我正在跟伟大的球员们打球,和世界上最好的球员们竞争。这比赛 — 就是我一直想要的
    理想你几岁_639f阅读 129评论 0 0
  • 我算什么呀?无力感,失望都在我心里,因为爱,所以放手
    凌玲_别阅读 89评论 0 0