美文网首页
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