美文网首页
JavaScript笔记-3

JavaScript笔记-3

作者: 蚂蚁踩死我 | 来源:发表于2019-03-24 14:39 被阅读0次

    函数

    返回值

    • 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}
      

    相关文章

      网友评论

          本文标题:JavaScript笔记-3

          本文链接:https://www.haomeiwen.com/subject/cwduvqtx.html