函数内部

97 阅读1分钟

arguments

  • 它是一个类数组对象,包含调用函数时传入的所有参数
  • 以function关键字定义的才会有arguments (箭头函数没有)
    • callee 是指向 arguments 对象所在函数的指针
  • eg
        // 以function关键字定义的才会有arguments 
        function text(num) {
            if (num <= 1) {
                return 1;
            } else {
                // num * arguments.callee(num - 1) ===  num * text(num - 1)
                return num * arguments.callee(num - 1); 
            }
        }
        text(3); // 6
        console.log(text(3)); // 结果 6

this

  • 标准函数
    • this引用的是把函数当成方法调用的上下文对象
    • 这时候通常称其为this值(在网页的全局上下文中调用函数时,this指向window)
      • eg
          // this指向
          window.color = 'red';
          let o = {
              color : 'yellow'
          };
          function sayColor() {
              console.log(this.color);
          }
          // 全局调用
          sayColor(); // red
          // 赋值给 o
          o.sayColor = sayColor;
          o.sayColor(); // yellow
      
  • 箭头函数
    • this引用的是定义箭头函数的上下文
    • 箭头函数是在window上下文中定义的
      • eg
          // this指向
          window.color = 'red';
          let o = {
              color : 'yellow'
          };
          let sayColor = () => console.log(this.color);
          // 全局调用
          sayColor(); // red
          // 赋值给 o
          o.sayColor = sayColor;
          o.sayColor(); // red
      
  • 在事件回掉或定时回掉this指向并非自己想要的对象
    • 将回调函数写成箭头函数可以解决
    • 箭头函数中的this会保留定义该函数时的上下文
      • eg
          function King() {
              this.royaltyName = 'Mack';
              setTimeout(() => {
                  console.log(this.royaltyName);
              }, 1000);
          }
          function Queen() {
              this.royaltyName = 'Marray';
              setTimeout(function() {
                  console.log(this.royaltyName);
              }, 1000);
          }
          new King(); // Mack
          new Queen(); // undefined
      

函数属性和方法

  • 属性
    • length
      • length属性保存函数定的命名参数的个数
    • prototype
      • prototype是保存引用类型所有实例方法的地方
  • 方法
    • apply()
      • eg
          function sum(num1, num2) {
              return num1 + num2;
          }
          function callSum1(num1, num2) {
              return sum.apply(this, arguments);
          }
          function callSum2(num1, num2) {
              return sum.apply(this, [num1, num2]);
          }
          console.log(callSum1(10,10)); // 20
          console.log(callSum2(10,20)); // 30
      
    • call()
    • eg
          function sum(num1, num2) {
              return num1 + num2;
          }
          function callSum(num1, num2) {
              return sum.call(this, num1, num2);
          }
          console.log(callSum(10,10)); // 20
      
    • bind()
    • eg
         // bind
         window.color = 'red';
         let o = {
              color: 'blue'
         };
         function sayColor() {
             console.log(this.color);
         }
         let objSayColor = sayColor;
         objSayColor(); // red
         let objSayColorBind = sayColor.bind(o);
         objSayColorBind(); // blue
      
  • call() 和 apply区别
    • 直接传arguments对象或一个数组用 apply()
    • 单个传用 call()