详解JavaScript中的函数调用

时间:2024-09-30 07:31:15

8.2 函数调用

函数主体的JS代码在定义之前并不会执行,只有调用函数时,才会执行。

4中调用方法:

  • 作为函数
  • 作为方法
  • 作为构造函数
  • 通过call()和apply()间接调用

8.2.1 函数调用

8.2.2 方法调用

一个方法无非是保存在一个对象属性里的JS函数,一个函数f和一个对象o,则可以用下面代码给o定义一个名为m()的方法:

o.m=f;

给对象o定义了方法m(),调用它时就像这样:

o.m();

或者,如果m()需要两个实参,调用起来则像这样:

o.m(x,y)

上面代码是一个调用表达式,包括一个函数式o.m,以及两个实参x,y,函数表达式本身就是一个属性访问表达式,这意味着该函数被当做一个方法,而不是作为一个普通函数来调用。

方法调用和函数调用的重要区别,调用上下文,属性访问表达式由两部分组成:一个对象o和属性名称m,像这样的方法调用表达式里,对象o成为调用上下文,函数体可以使用关键字this引用该对象。例子如下:

方法和this关键字是面向对象编程范式的核心,任何函数只要作为方法调用实际上都会传入一个隐式的实参,这个参数是一个对象,方法调用的母体就是这个对象,通常来讲,基于那个对象的方法可以执行多种操作,方法调用的语法已经很清晰的表明了函数将基于一个对象操作。

方法链

当方法的返回值是一个对象,这个对象还可以再调用它的方法,这种方法调用序列中他每次调用结果都是另外一个表达式的组成部分。

例如:$(":header").map(function(){return this.id}).get().sort();

关键字this

和变量不同,关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this,如果嵌套函数作为方法调用,其this不是全局对象,很多人以为this会指向调用外层函数的上下文,如果你想访问这个外部函数的this值,需要将this的值保存在一个变量里,这个变量和内部函数在同一个作用域内,通常使用self来保存this,比如:

8.2.3 构造函数调用

如果函数或者方法调用之前带有关键字new,它就构成了构造函数调用。构造函数调用和普通的函数调用以及方法调用在实参处理,调用上下文和返回值方面都有不同。

有实参和普通函数没区别,如果没有形参,JS允许省略实参列表和圆括号,以下是等价的:

var o = new Object();

var o = new Object;

构造函数调用创建一个新的空对象,这个对象继承自构造函数prototype属性,构造函数试图初始化这个新创建的对象,并将这个对象用作其调用上下文,因此构造函数可以使用this关键字来引用新创建的对象。

8.2.4 间接调用

JS中函数也是对象,函数可以包含方法,其中call()和apply()可以用来间接地调用函数。