JavaScript中的函數上下文和apply,call

來源:互聯網
上載者:User

下面內容摘抄自《JavaScript核心》。

在Java或者C/C++等語言中,方法(函數)只能依附於對象而存在,不是獨立的。而在JavaScript中,函數也是一種對象,並非其他任何對象的一部分,理解這一點尤為重要,特別是對理解函數式的JavaScript非常有用,在函數式程式設計語言中,函數被認為是一等的。

函數的上下文是可以變化的,因此,函數內的this也是可以變化的,函數可以作為一個對象的方法,也可以同時作為另一個對象的方法,總之,函數本身是獨立的。可以通過Function對象上的call或者apply函數來修改函數的上下文:

 

call和apply通常用來修改函數的上下文,函數中的this指標將被替換為call或者apply的第一個參數,我們不妨來看看2.1.3小節的例子:

//定義一個人,名字為jackvar jack = {    name : "jack",    age : 26}//定義另一個人,名字為abruzzivar abruzzi = {    name : "abruzzi",    age : 26}//定義一個全域的函數對象function printName(){    return this.name;}//設定printName的上下文為jack, 此時的this為jackprint(printName.call(jack));//設定printName的上下文為abruzzi,此時的this為abruzziprint(printName.call(abruzzi));print(printName.apply(jack));print(printName.apply(abruzzi));

 

只有一個參數的時候call和apply的使用方式是一樣的,如果有多個參數:

setName.apply(jack, ["Jack Sept."]);print(printName.apply(jack));setName.call(abruzzi, "John Abruzzi");print(printName.call(abruzzi));

得到的結果為:

Jack Sept.

John Abruzzi


apply的第二個參數為一個函數需要的參數組成的一個數組,而call則需要跟若干個參數,參數之間以逗號(,)隔開即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.