歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> JavaScript中apply()和call()方法解析

JavaScript中apply()和call()方法解析

日期:2017/3/1 9:10:50   编辑:Linux編程

一.簡介

本文結合基本JavaScript的權威書籍中的內容,根據自己的理解,通過相關示例向大家展示了JavaScript中call,apply使用及區別,希望大家能夠喜歡,如有不足,也希望提出建議,大家共同進步。

JavaScript權威指南(第6版) PDF中文版+英文版+源代碼 下載地址見 http://www.linuxidc.com/Linux/2013-10/91056.htm

call() 方法在使用一個指定的this值和若干個指定的參數值的前提下調用某個函數或方法.

apply() 方法在指定 this值和參數(參數以數組或偽數組的形式存在)的情況下調用某個函數。

注意:這兩種方法很類似,只有一個區別,就是call()法接受的是若干個參數的列表,而aapply()方法接受的是一個包含多個參數的數組及偽數組

二.基礎語法

fun.call(thisArg,arg1,arg2...)

fun.apply(thisArg,[argArray1, argArray2...])

三.參數

  1.call()的參數:

    1).thisArg
  在函數運行時第一個參數是指定的this的值。需要注意的是,指定的this值並不一定是該函數執行時真正的this值,如果這個函數處於非嚴格模式下,則指定為null和undefined的this值會自動指向  全局對象(浏覽器中就是window對象),同時值為基本數據類型時(數字,字符串,布爾值)的this會指向該基本數據類型的自動包裝對象。
    2).arg1, arg2, ...
  指定的參數列表。
2.apply()的參數:
 1).thisArg
在函數運行時第一個參數是指定的this的值。需要注意的是,指定的this值並不一定是該函數執行時真正的this值,如果這個函數處於非嚴格模式下,則指定為null或undefined時會自動指向全象
浏覽器中就是(window對象),同時值為基本數據類型時(數字,字符串,布爾值)的this會指向該基本數據類型的自動包裝對象。
 2).argsArray
一個數組或者是偽數組,其中的數組元素將作為單獨的參數傳給函數。如果該參數的值null或undefined,則表示不需要傳入任何參數。但是使用偽數組時,要考慮兼容性問題。

四.返回值

返回結果包括制定的this值和參數。

五.示例

下面列舉一下這兩種方法的常用場景。

1.使用call方法調用構造函數

在一個子構造函數中,你可以通過調用父構造函數的call方法來實現繼承.下例中,使用Student構造函數創建的對象實例都會擁有在Person構造函數中添加的name屬性和age屬性,但study屬性是在構造函數中定義的。

  function Person(name,age){

    this.name=name;

    this.age=age;

  }

  function Student(name,age){

    Person.call(this,name,age);

    this.study="math";

}

var excellent=new Student("李四",20)

console.log(excellent) // Student {name: "李四", age: 20, study: "math"}

2.使用apply和內置對象

聰明的apply用法允許你在某些本來需要寫成遍歷數組變量的任務中使用內建的函數(內置對象)。在接下裡的例子中我們會使用Math.max/Math.min來找出一個數組中的最大/最小值。

  var numbers=[2,3,7,8,6]

  var max=Math.max.apply(,null,numbers)

  var min=Math.min.apply(,null,numbers)

  console.log(max) //8

  console.log(min) //2

六.總結

  1.可以讓call()中的對象調用當前對象所擁有的function。你可以使用call()來實現繼承:寫一個方法,然後讓另外一個新的對象來繼承它(而不是在新對象中再寫一次這個方法)。

  2.在調用一個存在的函數時,你可以為其第一個參數指定一個this對象。this指當前對象,也就是正在調用這個函數的對象。使用apply(), 你可以只寫一次這個方法然後在另一個對象中繼承它,而不用在新對象中重復寫該方法。apply()與call()非常相似,不同之處在於提供參數的方式。apply()使用參數數組而不是一組參數列表。apply()可以使用數組或偽數組

  3.你也可以使用arguments對象作為 argsArray參數。 arguments是一個函數的局部變量。 它可以被用作被調用對象的所有未指定的參數。 這樣,你在使用apply函數的時候就不需要知道被調用對象的所有參數。你可以使用arguments來把所有的參數傳遞給被調用對象。 被調用對象接下來就負責處理這些參數。

  4.從 ECMAScript 第5版開始,可以使用任何種類的偽數組(類數組對象),需要注意:Chrome 14 以及 Internet Explorer 9 仍然不接受偽數組。如果傳入偽數組,它們會拋出異常。

Copyright © Linux教程網 All Rights Reserved