2022.2.16

8、函数

  • 定义函数,方式一

    fuction abs(x){
        if(x >=0){return x}
        else{return -x}
    }
    
    • 注意:一旦执行到return,代表函数结束,返回结果;如果没有执行return,函数执行完也会返回结果,结果就是undefined
  • 定义函数,方式二

    var(let) abs = fuction(x){
        if(x >=0){return x}
        else{return -x}
    }
    
    • fuction()是一个匿名函数,可以将其赋值给变量
  • 调用函数

    • 参数问题

      1、不存在参数问题

      //在参数内添加如下:
      if(typeof x !== 'number'){throw 'Not a Number'}
      

      2、arguments

      • arguments是代表传递进来的所有的参数,是一个数组,但是其包含所有的参数,我们有时候想试用多余的参数来进行附加操作,需要排除已有的参数。如:

        abs(213,23,123,1,24,3,25,76,9)//函数承接上文定义中的代码
        x = 213
        arguments(9){[213,23,123,1,24,3,25,76,9]}
        

      3、rest

      • rest也是带表传递进来的所有参数,也是一个数组,不过其不包含已被使用的参数。如:

        fuction abs(x,...rest){...}//定义时有些许不同
        abs(213,23,123,1,24,3,25,76,9)//函数承接上文定义中的代码
        x = 213
        arguments(9){[213,23,123,1,24,3,25,76,9]}
        rest(8){[23,123,1,24,3,25,76,9]}//参数213已被传递给x,故rest中没有213
        

9、变量的作用域

  • 在js中的变量是有定义域的,若在函数体中声明在函数体外不可使用
function abs(){
        let x = 1;
        x = x + 1;
    }
    x = x + 2;//Uncaught ReferenceError: x is not defined
  • 内部函数可以访问外部函数的成员,但外部函数不能访问内部函数的成员

    function abs(){
            let x = 1;
            x = x + 1;
        	  function abc(){
                  let y = x + 1;
              }
        	  z = y + 1;
        }
    console.log(y)//不报错
    console.log(z)//报错
    
  • js中,函数查找变量从自身函数开始,由内向外查找,内部拥有变量,则不使用外部变量,若没有则查找使用外部变量

    function abs(){
            let x = 1;
        	  function abc(){
                  let x = 2;
                  console.log(x);//输出2,不再查询外部函数
              }
        	  console.log(x);//输出1,查询不了内部函数
        	  abc()
        }
    
  • 提升变量的作用域:js执行引擎自动提升变量的声明,但不会优先赋值(不先于赋值前的操作)

    function abs(){
        let x = 1;
        y = x + 1;
        let y;
    }//此时不会报“y未被声明”的错,但当x有值时,y不会被赋值
    
  • 全局函数

    • 全局变量

      x = 1;//x为全局变量,声明不需要加数据类型,且在函数外
      function abs(){...}
      
    • 全局对象window

      var x = 'xxx';
      alert(x);
      alert(window.x);//所有的全局变量会被window对象纳入旗下,该语句和上一条语句输出一致
      
      
    • js实际上只有一个全局作用域,任何变量(包括自定义及内部函数)若没有在函数作用范围内找到,就会向外查找,若在全局作用域没有找到,就会报错

      	  let x = "xxx";
           window.alert(x);
           let old_alert = window.alert;
           window.alert = function (){
      
           };
           window.alert(123);//此时alert函数失效
           window.alert = old_alert;
           window.alert(456)//alert()恢复
      	  window.alert(y);//报错Uncaught ReferenceError: y is not defined
      
      • 注意:由于所有全局变量都会绑定到window上,若果不同的js文件使用了相同的变量,则会发生冲突
    • 局部作用域let

      • 在for循环中,若括号内使用var:

         function aaa(){
        	  for(var i = 1; i < 100; i++)
                {
                    console.log(i);//依次输出1~99
                }
             console.log(i+1);//最后输出101
        }
        
      • 若使用let:

        function aaa(){
        	  for(let i = 1; i < 100; i++)
                {
                    console.log(i);//依次输出1~99
                }
             console.log(i+1);//报错,没有找到变量i
        }
        
    • 常量定义const

      • 使用const定义的变量为常量,其值不可更改
      • 注意:在ES6之前常量均是使用“var+大写字母”定义的,遇见时不建议更改

10、方法

  • 方法就是把函数放在对象里,对象只有两个东西,属性和方法

    let lisi = {
            name:"小明",
            birth:2020,
            age : function() {
                let now = new Date().getFullYear();
                return now-this.birth;//this仅在调用this的元素的上一级寻找指定变量
            }
        };
    lisi.name;//调用对象属性
    lisi.age();//调用对象的方法
    }
    
  • 关于this

    //将上述代码改成:
    var getage = function(){
            var now = new Date().getFullYear();
            return now-this.birth;
        }
        let xiaoming = {
            name:"小明",
            birth:2020,
            age : getage
        };
    xiaoming.age()//再次输出小明年龄时也可以输出
    getage()//输出getage函数是结果是NaN,即this此时失效
    
  • 关于apply

    • 由上述可知,当函数体外部没有函数时,this失效,因此js引入apply来给this定向,如:

      var getage = function(){
              var now = new Date().getFullYear();
              return now-this.birth;
          }
          let xiaoming = {
              name:"小明",
              birth:2020,
              age : getage
          };
      getage.apply(xiaoming,[])//输出age的值,apply括号内有两个参数,第一个为this指向的对象,第二个为给this传递的参数(没有参数时传空参)
      

11、内部对象

  • 标准对象

    • typeof 123
      'number'
      typeof '123'
      'string'
      typeof true
      'boolean'
      typeof NaN
      'number'
      typeof []
      'object'
      typeof {}
      'object'
      typeof Math.abs
      'function'
      typeof undefined
      'undefined'
      
  • Date

    •     var now = new Date();//完整时间
          now.getFullYear();//获取年
          now.getMonth();//获取月,注意js中的月份是0-11月
          now.getDate();//获取日
          now.getDay();//获取星期
          now.getHours();//获取小时
          now.getMinutes();//获取分钟
          now.getSeconds();//获取秒
          now.getMilliseconds();//获取毫秒
          console.log(new Date(1645018084175));//将时间戳转为普通时间
      
    • 转换

      console.log(new Date(1645018084175));//将时间戳转为普通时间
      now.toLocaleString()//获取当地时间
      now.toGMTString()//当地时间转为GMT时间
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值