JavaScript 函数调用

  • 调用JavaScript函数

    定义函数时,不执行函数内的代码。调用函数时,将执行函数内的代码。通常使用术语“call”而不是“invoke”。通常说“调用函数”,“启动函数”或“执行函数”。在本教程中,我们将使用invoke,因为可以在不调用的情况下调用JavaScript函数。
    function myFunction(a, b) {
      return a * b;
    }
    myFunction(10, 2);           // 将返回 20
    尝试一下
    上述功能不属于任何对象。但是在JavaScript中总是有一个默认的全局对象。在HTML中,默认的全局对象是HTML页面本身,因此上面的函数“属于”HTML页面。在浏览器中,页面对象是浏览器窗口。上述功能自动成为window函数。myFunction()和window.myFunction()是相同的函数:
    function myFunction(a, b) {
      return a * b;
    }
    window.myFunction(10, 2);    // 也将返回 20
    尝试一下
    这是调用JavaScript函数的常用方法,但不是一个很好的实践。全局变量,方法或函数可以轻松地在全局对象中创建名称冲突和错误。
  • this关键字

    在JavaScript中,所谓的this是“拥有”当前代码的对象。 this在函数中使用时,值是“拥有”函数的对象。
    请注意,this不是变量。这是一个关键字。你无法改变this的值。
    提示:在this关键字上阅读有关该关键字的更多信息。
  • 全局对象

    在没有所有者对象的情况下调用函数时,this成为全局对象。在Web浏览器中,全局对象是浏览器窗口。此示例返回window对象的值this:
    var x = myFunction();            // x将是window对象
    
    function myFunction() {
      return this;
    }
    尝试一下
    调用函数作为全局函数,使的值this是全局对象。将window对象用作变量很容易导致程序崩溃。
  • 将函数作为方法调用

    在JavaScript中,您可以将函数定义为对象方法。以下示例创建一个对象(myObject),其中包含两个属性(firstName和lastName)和一个方法(fullName):
    var myObject = {
      firstName:"John",
      lastName: "Doe",
      fullName: function () {
        return this.firstName + " " + this.lastName;
      }
    }
    myObject.fullName();         // 将返回 "John Doe"
    尝试一下
    的全名的方法是一个函数。该函数属于该对象。myObject是函数的所有者。所谓的this是“拥有”JavaScript代码的对象。在这种情况下的this的值是myObject的。测试一下!更改fullName方法以返回值this:
    var myObject = {
      firstName:"John",
      lastName: "Doe",
      fullName: function () {
        return this;
      }
    }
    myObject.fullName();          // 将返回 [object Object] (所有者对象)
    尝试一下
    将函数作为对象方法调用,会使值this成为对象本身。
  • 使用函数构造函数调用函数

    如果函数调用前面有new关键字,则它是构造函数调用。看起来你创建了一个新函数,但由于JavaScript函数是对象,你实际上创建了一个新对象:
    // 这是一个构造函数:
    function myFunction(arg1, arg2) {
      this.firstName = arg1;
      this.lastName  = arg2;
    }
    
    // 这里创建一个对象
    var x = new myFunction("John", "Doe");
    x.firstName;                             // 将返回 "John"
    
    尝试一下
    构造函数中的this关键字没有值。值this将是调用函数时创建的新对象。