在 js 中,不管是函數, 仍是方法, 仍是事件, 仍是構造器...這些東西的本質都是函數,其中的區別只是所處的位置不一樣。根據函數內部this的指向不一樣,能夠將函數的調用模式分紅4種:函數模式、方法模式、構造器模式和上下文模式等四種不一樣的調用模式。數組
解決方法:
首先先來分析this指向問題:瀏覽器
一、任何函數都有屬於本身的thisapp
二、this的指向和函數的調用模式相關,意味着this的指向在函數聲明的時候肯定不了。而後分析this指向的思路:函數
一、this是屬於哪一個函數的this
二、這個函數的調用模式是哪一種對象
四種調用模式事件
一、函數模式字符串
特徵:簡單的函數調用,函數名前面沒有任何引導內容。變量
this 的含義: 在 函數中 this 表示全局對象, 在瀏覽器中this表示window。
注:任何自調用函數都是函數模式
二、方法模式
特徵: 方法必定是依附於一個對象,將函數賦值給對象的一個屬性,那麼就成爲了方法。構造函數
this的含義:這個依附的對象
注:arguments 這種僞數組, 或者 [] 數組這樣的對象中, 這樣調用函數也是方法調用, this 會只指向對象。
三、構造器模式(構造函數模式,構造方法模式)
特徵:
(1)、使用 new 引導構造函數, 建立了一個實例對象
(2)、在建立對象的同時, 將this指向這個剛剛建立的對象
(3)、在構造函數中, 不須要 return , 會默認的 return this
分析:
因爲構造函數只是給 this 添加成員, 而方法也能夠完成這個操做,對與 this 來講, 構造函數和方法沒有本質區別
關於return的補充:
在構造函數中,普通狀況,能夠理解爲構造函數已經默認進行了return this,添加在後面的都不會執行
若是手動的添加 return ,就至關於 return this.
若是手動的添加 return 基本類型(字符串, 數字, 布爾), 無效, 仍是 return this
若是手動的添加 return null 或 return undefined, 無效, 仍是 return this
特殊狀況, return對象, 最終返回對象
手動添加return對象類型,那麼原來建立的this會被丟掉,返回 return 後面的對象
四、上下文調用模式
特徵:上下文調用模式也叫方法借用模式,分爲apply與call,上下文 就是環境, 就是自定義設置this的含義
語法:
函數名.apply(對象,[參數]);
函數名.call(對象,參數);
描述:
函數名就是表示的函數自己, 使用函數進行調用的時候默認 this 是全局變量
函數名也能夠是方法提供, 使用方法調用的時候, this 是指當前對象.
使用apply進行調用後, 不管是函數,仍是方法都無效了。咱們的 this, 由apply的第一個參數決定
注意:
若是函數或方法中沒有 this 的操做, 那麼不管什麼調用其實都同樣.
若是是函數調用foo(),那麼有點像foo.apply(window).
若是是方法調用o.method(),那麼有點像o.method.apply(o).
不管是call仍是apply在沒有後面的參數的狀況下(函數無參數,方法無參數)是徹底同樣的。
第一個參數的使用也是有規則的
若是傳入的是一個對象, 那麼就至關於設置該函數中的 this 爲參數
若是不傳入參數, 或傳入null、 undefiend 等, 那麼至關於this默認爲 window。