js的function对象和闭包函数

发布时间 2023-07-26 15:49:04作者: carol2014
<script>
  // Function对象的call和apply方法:可以用来调用所有者对象作为参数的方法,通过call和apply方法,能够使用属于另一个对象的方法。
  //call() 和 apply() 之间的区别:call() 方法分别接受参数。apply() 方法接受数组形式的参数。如果要使用数组而不是参数列表,则 apply() 方法非常方便。
  var personFunc = {
    fullName: function (city, country) {
      return this.firstName + " " + this.lastName + "," + city + "," + country;
    },
  };
  var person = {
    firstName: "Bill",
    lastName: "Gates",
  };
  console.log(personFunc.fullName.apply(person, ["Oslo", "Norway"])); //Bill Gates,Oslo,Norway

  console.log(personFunc.fullName.call(person, "Seattle", "USA")); //Bill Gates,Seattle,USA

  let fullName = personFunc.fullName.bind(person);
  console.log(fullName("Seattle", "USA")); //Bill Gates,Seattle,USA

  Math.max(1, 2, 3); // 会返回 3
  // 在数组上模拟 max 方法
  Math.max.apply(null, [1, 2, 3]); // 也会返回 3

  //闭包函数
  // 简称“闭包”,指的是有权访问另一个函数作用域内的变量(局部变量)的函数。
  // 即函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
  // 内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响
  // 闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
  // 注意::由于闭包会使函数中的变量一直保存在内存中,内存消耗很大,所以闭包的滥用可能会降低程序的处理速度,造成内存消耗等问题。
  var add = (function () {
    var counter = 0;
    return function () {
      return (counter += 1);
    };
  })();
</script>