函數的四種調用方式,你掌握了幾種呢?

關注小編 私信01,獲取C/C++相關資料!因為有人私信小編說想看函數調用,小編就整理了一下,希望對你們有幫助!

函數的四種調用方式

函數有下列調用模式

  1. 函數調用模式
  2. 方法調用模式
  3. 構造器模式
  4. 上下文模式

1. 函數調用 模式

要調用,就肯定要先定義,函數的定義方式:

  1. 聲明式: function fuc() {}
  2. 表達式式: var func = function() {};
  3. Function: new Function( ‘參數’,…,’函數體’ );

單獨獨立調用的,就是函數調用模式,即 函數名( 參數 ),不能加任何其他的東西, 對象 o.fuc() 就不是了。

在函數調用模式中,

this 表示全局對象 window

任何自調用函數都是函數模式。

函數的四種調用方式,你掌握了幾種呢?

2. 方法調用 模式 method

所謂方法調用,就是用對象的方法調用。方法是什麼,方法本身就是函數,但是,方法不是單獨獨立的,而是要通過一個對象引導來調用。

就是說方法對象一定要有宿主對象

對象.方法(參數)

this表示引導方法的對象,就是指宿主對象

對比-函數調用模式:

  1. 方法調用模式是不是獨立的,需要宿主,而函數調用模式是獨立的
  2. 方法調用模式方式:obj.fuc(); 函數調用模式方式: fuc();
  3. 方法調用模式中,this指宿主。而函數調用模式中 this 指 全局對象window

美團的一道面試題

函數的四種調用方式,你掌握了幾種呢?

解析:

  1. fn() 前面沒有引導對象,是函數調用模式, this是全局對象,輸出 10
  2. arguments[ 0 ](),arguments是一個偽數組對象, 這裡調用相當於通過數組的索引來調用.
  3. 這裡引導對象即宿主就是 arguments對象。
  4. 所以,執行時,this 就是指 arguments,由於傳了兩個參數,所以 輸出為 arguments.length 就是 2
函數的四種調用方式,你掌握了幾種呢?

3. 構造器模式(構造函數模式, 構造方法模式)

constructor

  1. 特點: 使用 new 關鍵字引導
  2. 執行步驟:var p = new Person();
  3. new 是一個運算符, 專門用來申請創建對象, 創建出來的對象傳遞給構造函數的 this。然後利用構造函數對其初始化。
函數的四種調用方式,你掌握了幾種呢?

執行完 new 進入構造函數時, p 對象的原型 就指向了 構造函數 Person

而 構造時,this 指的的是 p 對象,是通過對象動態添加屬性來構造的

小貼士:如果調用構造函數的時候, 構造函數沒有參數, 圓括號是可以省略的。

函數的四種調用方式,你掌握了幾種呢?

  1. ↑ 不傳參,可以簡寫,不影響構造
  2. 返回值
  3. 不寫 return 語句, 那麼 構造函數 默認返回 this
  4. 在構造函數 return 基本類型( return num, return 1223 ). 則忽略返回類型.
  5. 在構造函數 return 引用類型, 那麼構造函數返回該引用類型數據, 而忽略 this
函數的四種調用方式,你掌握了幾種呢?

↑ 忽略了 123,返回 this 對象, 指向構建的實例

函數的四種調用方式,你掌握了幾種呢?

↑ 忽略了 this,返回 { ‘peter’: ‘nihao’ } 對象

構造函數結合性

  1. 如果構造函數沒有參數, 可以省略 圓括號
  2. var p = new Person;
  3. 如果希望創建對象並直接調用其方法
  4. ( new Person () ).sayHello()
  5. -> 可以省略調整結核性的圓括號 new Person().sayHello()
  6. -> 如果想要省略構造函數的圓括號, 就必須添加結核性的圓括號 (new Person).sayHello()

面試題

一道面試題,大家可以自己嘗試先做一下,再看下面的答案和解析

請問順序執行下面代碼,會怎樣 alert

函數的四種調用方式,你掌握了幾種呢?

預解析,簡化後的代碼,以及答案

函數的四種調用方式,你掌握了幾種呢?

全部解析就不放上來了,自己好好琢磨一下。

4. 上下文調用模式

就是 環境調用模式 => 在不同環境下的不同調用模式

簡單說就是統一一種格式, 可以實現 函數模式與方法模式

-> 語法(區分)

  1. call 形式, 函數名.call( … )
  2. apply 形式, 函數名.apply( … )

這兩種形式功能完全一樣, 唯一不同的是參數的形式. 先學習 apply, 再來看 call 形式

apply方法的調用形式

存在上下文調用的目的就是為了實現方法借用,且不會汙染對象。

  • 如果需要讓函數以函數的形式調用, 可以使用
  • foo.apply( null ); // 上下文為 window
  • 如果希望他是方法調用模式, 注意需要提供一個宿主對象
  • foo.apply( obj ); // 上下文 為 傳的 obj 對象
函數的四種調用方式,你掌握了幾種呢?

帶有參數的函數如何實現上下文調用?

函數的四種調用方式,你掌握了幾種呢?

使用 apply 進行調用, 如果函數是帶有參數的. apply 的第一個參數要麼是 null 要麼是對象

  1. 如果是 null 就是函數調用
  2. 如果是 對象就是 方法調用, 該對象就是宿主對象, 後面緊跟一個數組參數, 將函數所有的參數依次放在數組中.
函數的四種調用方式,你掌握了幾種呢?


分享到:


相關文章: