美文网首页
call()和apply()的区别 和闭包

call()和apply()的区别 和闭包

作者: 啊笨猫 | 来源:发表于2019-07-05 15:33 被阅读0次

MDNapply资料

MDNcall资料

  • apply()和call()

    • 作用都是调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。
    function Product(name, price) {
      this.name = name;
      this.price = price;
    }
    
    function Food(name, price) {
      Product.call(this, name, price);
      this.category = 'food';
    }
    
    console.log(new Food('cheese', 5).name);
    // expected output: "cheese"
    
    var numbers = [5, 6, 2, 3, 7];
    
    var max = Math.max.apply(null, numbers);
    
    console.log(max);
    // expected output: 7
    
    var min = Math.min.apply(null, numbers);
    
    console.log(min);
    // expected output: 2
    
    • 他们之间的区别只有一个区别 就是 call() 方法接受的是一个参数列表,而 apply() 方法接受的是一个包含多个参数的数组
  • 闭包 MDN

    • 闭包 它允许将函数与其所操作的某些数据(环境)关联起来。这显然类似于面向对象编程。在面向对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联

      • 能够访问另一个函数作用域的变量的函数。清晰的讲:闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。
      function outer() {
           var  a = '变量1'
           var  inner = function () {
                  console.info(a)
           }
          return inner    // inner 就是一个闭包函数,因为他能够访问到outer函数的作用域
      }
      
    • 坑点

      • 1.this指向问题
      var object = {
               name: ''object",
               getName: function() {
                  return function() {
                       console.info(this.name)
                  }
              }
      object.getName()()    // underfined}
      // 因为里面的闭包函数是在window作用域下执行的,也就是说,this指向windows
      

      -2.存泄露问题

      function  showId() {
          var el = document.getElementById("app")
          el.onclick = function(){
            aler(el.id)   // 这样会导致闭包引用外层的el,当执行完showId后,el无法释放
          }
      }
       改成下面
      function  showId() {
          var el = document.getElementById("app")
          var id  = el.id
          el.onclick = function(){
            aler(id)  
            // 这样会导致闭包引用外层的el,当执行完showId后,el无法释放
          }
          el = null    // 主动释放el
      }
      
      
      • 3 引用的变量可能发生变化
      function outer() {
            var result = [];
            for (var i = 0; i<10; i++){
              result.[i] = function () {
                  console.info(i)
              }
           }
           return result
      }
      看样子result每个闭包函数对打印对应数字,1,2,3,4,...,10, 实际不是,因为每个闭包函数访问变量i是outer执行环境下的变量i,随着循环的结束,i已经变成10了,所以执行每个闭包函数,结果打印10, 10, ..., 10怎么解决这个问题呢?
      
      function outer() {
            var result = [];
            for (var i = 0; i<10; i++){
              result.[i] = function (num) {
                   return function() {
                         console.info(num);    // 此时访问的num,是上层函数执行环境的num,数组有10个函数对象,每个对象的执行环境下的number都不一样
                   }
              }(i)
           }
           return result
      }
      

相关文章

网友评论

      本文标题:call()和apply()的区别 和闭包

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