JavaScript学习笔记(八)

49、JavaScript 函数定义

  • JavaScript 函数是通过 function 关键词定义的。
  • 您可以使用函数声明或函数表达式。

49.1 函数声明

  • 语法:
function functionName(parameters) {
   要执行的代码
}

示例:

<body>
    <p id="demo"></p>
    <script>
      var x = myFunction(3, 6);
      document.getElementById("demo").innerHTML = x;
      function myFunction(a, b) {
        return a * b;
      }
    </script>
  </body>

输出:18

49.2 函数表达式

  • JavaScript 函数也可以使用表达式来定义。

  • 函数表达式可以在变量中存储:

 <body>
    <p id="demo"></p>
    <script>
      var x = function (a, b) {
        return a * b;
      };
      document.getElementById("demo").innerHTML = x;
    </script>
  </body>

输出:function (a, b) { return a * b; }

  • 在变量中保存函数表达式之后,此变量可用作函数:
  <body>
    <p id="demo"></p>
    <script>
      var x = function (a, b) {
        return a * b;
      };
      document.getElementById("demo").innerHTML = x(3, 4);
    </script>
  </body>

输出:12

49.3 Function() 构造器

  • 正如您在之前的例子中看到的,JavaScript 函数是通过 function 关键词定义的。

  • 函数也可以通过名为 Function() 的内建 JavaScript 函数构造器来定义。

 <body>
    <p id="demo"></p>
    <script>
      document.getElementById("demo").innerHTML = myFunction(3, 6);
      function myFunction(a, b) {
        return a * b;
      }
    </script>
  </body>

输出:18

或者:

<body>
    <p id="demo"></p>
    <script>
      var myFunction = function (a, b) {
        return a * b;
      };
      document.getElementById("demo").innerHTML = myFunction(3, 6);
    </script>
  </body>

输出:18

49.4 自调用函数

  • 函数表达式可以作为“自调用”。

  • 自调用表达式是自动被调用(开始)的,在不进行调用的情况下。

  • 函数表达式会自动执行,假如表达式后面跟着 ()

  • 您无法对函数声明进行自调用。您需要在函数周围添加括号,以指示它是一个函数表达式:

<body>
    <p id="demo"></p>
    <script>
      (function () {
        document.getElementById("demo").innerHTML = "自调用内容";
      })();
    </script>
  </body>

输出:自调用内容

49.5 函数可用作值

  • JavaScript 函数可被用作值:
<body>
    <p id="demo"></p>
    <script>
      var myFunction = function (a, b) {
        return a * b;
      };
      document.getElementById("demo").innerHTML = myFunction(3, 6);
    </script>
  </body>

输出:18

  • JavaScript 函数可用在表达式中:
  <body>
    <p id="demo"></p>
    <script>
      function myFunction(a, b) {
        return a * b;
      }
      var x = myFunction(3, 4) * 5;
      document.getElementById("demo").innerHTML = x;
    </script>
  </body>

输出:60

49.6 函数是对象

  • JavaScript 中的 typeof 运算符会为函数返回 “function”。但是最好是把 JavaScript 函数描述为对象。

  • JavaScript 函数都有属性和方法。

  • arguments.length 会返回函数被调用时收到的参数数目:

 <body>
    <p id="demo"></p>
    <script>
      function myFunction(a, b) {
        return arguments.length;
      }
      var x = myFunction(3, 4);
      document.getElementById("demo").innerHTML = x;
    </script>
  </body>

输出:2

  • toString() 方法以字符串返回函数:
<body>
    <p id="demo"></p>
    <script>
      function myFunction(a, b) {
        return a * b;
      }
      document.getElementById("demo").innerHTML = myFunction.toString();
    </script>
  </body>

输出:function myFunction(a, b) { return a * b; }

  • 定义为对象属性的函数,被称为对象的方法。

  • 为创建新对象而设计的函数,被称为对象构造函数(对象构造器)。

49.7 箭头函数

  • 箭头函数允许使用简短的语法来编写函数表达式。

  • 您不需要 function 关键字、return 关键字和花括号。

  <body>
    <p id="demo"></p>
    <script>
      // function myFunction(a, b) {
      //   return a * b;
      // }

      //可简化为:
      // var x = (a, b) => a * b;
      //或者
      var x = (a, b) => {
        return a * b;
      };
      document.getElementById("demo").innerHTML = x(5, 6);
    </script>
  </body>

输出:30

50、 JavaScript 函数参数

  • JavaScript 函数不会对参数值进行任何检查

50.1 函数参数

  • 函数参数(parameter)指的是在函数定义中列出的名称。

  • 函数参数(argument)指的是传递到函数或由函数接收到的真实值。

functionName(parameter1, parameter2, parameter3) {
    要执行的代码
}

50.2 参数规则

  • JavaScript 函数定义不会为参数(parameter)规定数据类型。

  • JavaScript 函数不会对所传递的参数(argument)实行类型检查。

  • JavaScript 函数不会检查所接收参数(argument)的数量。

50.3 参数默认

  • 如果调用参数时省略了参数(少于被声明的数量),则丢失的值被设置为:undefined
  <body>
    <p id="demo"></p>
    <script>
      function myFunction(a, b) {
        if (b === undefined) {
          b = 0;
        }
        return a * b;
      }

      document.getElementById("demo").innerHTML = myFunction(5);
    </script>
  </body>

输出:0

  • 如果函数调用的参数太多(超过声明),则可以使用 arguments 对象来达到这些参数。(如下)

50.4 arguments 对象

  • JavaScript 函数有一个名为 arguments 对象的内置对象。

  • arguments 对象包含函数调用时使用的参数数组。

示例:使用函数来查找(例如)数字列表中的最高值:

  <body>
    <p id="demo"></p>
    <script>
      function findMax() {
        var i;
        var max = -Infinity;
        for (i = 0; i < arguments.length; i++) {
          if (max < arguments[i]) {
            max = arguments[i];
          }
        }
        return max;
      }
      document.getElementById("demo").innerHTML = findMax(4, 5, 6);
    </script>
  </body>

输出:6

示例:创建一个函数来总和所有输入值:

<body>
    <p id="demo"></p>
    <script>
      function findMax() {
        var i;
        var sum = 0;
        for (i = 0; i < arguments.length; i++) {
          sum += arguments[i];
        }
        return sum;
      }
      document.getElementById("demo").innerHTML = findMax(4, 5, 6);
    </script>
  </body>

输出:15

51、JavaScript 函数调用

  • JavaScript 函数内部的代码会在“某物”调用它时执行。

51.1 以函数形式调用函数

  <body>
    <p id="demo"></p>
    <script>
      function myFunction(a, b) {
        return a * b;
      }
      document.getElementById("demo").innerHTML = myFunction(10, 2);
    </script>
  </body>

或者:

  <body>
    <p id="demo"></p>
    <script>
      function myFunction(a, b) {
        return a * b;
      }
      document.getElementById("demo").innerHTML = window.myFunction(10, 2);
    </script>
  </body>

输出:20

51.2 this 关键词

  • 全局对象:
 <body>
    <p id="demo"></p>
    <script>
      function myFunction() {
        return this;
      }
      document.getElementById("demo").innerHTML = myFunction();
    </script>
  </body>

输出:
[object Window]

  • 作为方法来调用函数:
  <body>
    <p id="demo"></p>
    <script>
      var myObject = {
        firstName: "文",
        lastName: "阿花",
        fullName: function () {
          return this.firstName + this.lastName;
        },
      };
      document.getElementById("demo").innerHTML = myObject.fullName();
    </script>
  </body>

输出:文阿花

或者:

  <body>
    <p id="demo"></p>
    <script>
      var myObject = {
        firstName: "文",
        lastName: "阿花",
        fullName: function () {
          return this;
        },
      };
      document.getElementById("demo").innerHTML = myObject.fullName();
    </script>
  </body>

输出:[object Object]

52、JavaScript 函数 Call

52.1 方法重用

  • 使用 call() 方法,您可以编写能够在不同对象上使用的方法。

52.2 函数是对象方法

  • 在 JavaScript 中,函数是对象的方法。

  • 如果一个函数不是 JavaScript 对象的方法,那么它就是全局对象的函数。

示例:下面的例子创建了带有三个属性的对象(firstName、lastName、fullName):

fullName 属性是一个方法。person 对象是该方法的拥有者。

fullName 属性属于 person 对象的方法。

<body>
    <p id="demo"></p>
    <script>
      var myObject = {
        firstName: "文",
        lastName: "阿花",
        fullName: function () {
          return this.firstName + this.lastName;
        },
      };
      document.getElementById("demo").innerHTML = myObject.fullName();
    </script>
  </body>

输出:文阿花

52.3 JavaScript call() 方法

  • call() 方法是预定义的 JavaScript 方法。

  • 它可以用来调用所有者对象作为参数的方法。

  • 通过 call(),您能够使用属于另一个对象的方法。

示例:本例调用 person 的 fullName 方法,并用于 person1:

 <body>
    <p id="demo"></p>
    <p id="demo1"></p>
    <script>
      var person = {
        fullName: function () {
          return this.firstName + this.lastName;
        },
      };

      var person1 = {
        firstName: "文",
        lastName: "阿花",
      };

      var person2 = {
        firstName: "肖",
        lastName: "战",
      };
      document.getElementById("demo").innerHTML = person.fullName.call(person1);
      document.getElementById("demo1").innerHTML =
        person.fullName.call(person2);
    </script>
  </body>

输出:文阿花

肖战

52.4 带参数的 call() 方法

call() 方法可接受参数:

 <body>
    <p id="demo"></p>
    <script>
      var person = {
        fullName: function (city, country) {
          return this.firstName + this.lastName + " " + city + " " + country;
        },
      };

      var person1 = {
        firstName: "文",
        lastName: "阿花",
      };

      var person2 = {
        firstName: "肖",
        lastName: "战",
      };
      document.getElementById("demo").innerHTML = person.fullName.call(
        person1,
        "郑州",
        "中国"
      );
    </script>
  </body>

输出:文阿花 郑州 中国

53、JavaScript 函数 Apply

53.1 方法重用

  • 通过 apply() 方法,您能够编写用于不同对象的方法。

53.2 JavaScript apply() 方法

  • apply() 方法与 call() 方法非常相似:

示例:在本例中,person 的 fullName 方法被应用到 person1:

 <body>
    <p id="demo"></p>
    <script>
      var person = {
        fullName: function () {
          return this.firstName + this.lastName;
        },
      };

      var person1 = {
        firstName: "文",
        lastName: "阿花",
      };

      var person2 = {
        firstName: "肖",
        lastName: "战",
      };
      document.getElementById("demo").innerHTML =
        person.fullName.apply(person1);
    </script>
  </body>

输出:文阿花

53.3 call() 和 apply() 之间的区别

不同之处是:

  • call() 方法分别接受参数。

  • apply() 方法接受数组形式的参数

  • 如果要使用数组而不是参数列表,则 apply() 方法非常方便。

53.4 带参数的 apply() 方法

  • apply() 方法接受数组中的参数。
 <body>
    <p id="demo"></p>
    <script>
      var person = {
        fullName: function (city, country) {
          return this.firstName + this.lastName + " " + city + " " + country;
        },
      };

      var person1 = {
        firstName: "文",
        lastName: "阿花",
      };

      var person2 = {
        firstName: "肖",
        lastName: "战",
      };
      document.getElementById("demo").innerHTML = person.fullName.apply(
        person1,
        ["郑州", "中国"]
      );
    </script>
  </body>

输出:文阿花 郑州 中国

53.5 在数组上模拟 max 方法

您可以使用 Math.max() 方法找到(数字列表中的)最大数字:

document.getElementById("demo").innerHTML = Math.max(1,2,3); 

或者:

Math.max.apply(null, [1,2,3]); // 也会返回 3

第一个参数(null)无关紧要。在本例中未使用它。

或者:

document.getElementById("demo").innerHTML = Math.max.apply(Math, [1,2,3]); 

或者:

Math.max.apply(" ", [1,2,3]); // 也会返回 3

或者:

Math.max.apply(0, [1,2,3]); // 也会返回 3

输出:3

54、函数借用:JavaScript Function bind()

函数借用(Function Borrowing

  • 通过使用 bind() 方法,一个对象可以从另一个对象借用一个方法。

示例:下面的例子创建了 2 个对象(person 和 member),member 对象借用了 person 对象的 fullname 方法:

  <body>
    <p id="demo"></p>
    <script>
      var person = {
        firstName: "钟",
        lastName: "离",
        fullName: function () {
          return this.firstName + this.lastName;
        },
      };

      var person1 = {
        firstName: "文",
        lastName: "阿花",
      };

      var person2 = {
        firstName: "肖",
        lastName: "战",
      };
      var fullName = person.fullName.bind(person1);
      document.getElementById("demo").innerHTML = fullName();
    </script>
  </body>

输出:文阿花

更多内容:JavaScript Function bind()

55、JavaScript 闭包

JavaScript 闭包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值