this綁定規(guī)則

this綁定規(guī)則萨蚕。
1酱虎、函數(shù)在調(diào)用時寨蹋,javascript會默認(rèn)給this綁定一個值
2松蒜、this的綁定和定義的位置(編寫的位置)沒有關(guān)系
3、this的綁定和調(diào)用方式以及調(diào)用的位置有關(guān)系
4已旧、this是在運行時被綁定的秸苗。

this有四種綁定規(guī)則:
分別為默認(rèn)綁定,隱式綁定运褪,顯式綁定惊楼,new綁定
規(guī)則一:默認(rèn)綁定
如下綁定方式都是默認(rèn)綁定玖瘸,
獨立函數(shù)調(diào)用時進(jìn)行默認(rèn)綁定,跟定義的位置沒有關(guān)系

// 案例一:
        function foo(){
            console.log(this)  //window1
        }
        foo() //獨立調(diào)用
        // 案例二:
        function foo1(){
            console.log(this)//window1
        }
        function foo2(){
            console.log(this)//window1
            foo1()
        }
        function foo3(){
            console.log(this)//window1
            foo2()
        }
        foo3()//獨立調(diào)用

        // 案例三:
        var obj = {
            name:'why',
            foo:function(){
                console.log(this)
            }
        } //跟定義的位置沒有關(guān)系
        var obj = obj.foo
        obj() //調(diào)用的方式有關(guān)系檀咙,獨立調(diào)用雅倒。

        // 案例四:
        function foo(){
            console.log(this) //window
        }
        var obj = {
            name:'why',
            foo:foo
        }
        var bar = obj.foo
        bar() //調(diào)用的方式有關(guān)系,獨立調(diào)用弧可。

        // 案例五:
        function foo(){
            return function(){
                console.log(this)  //window
            }
        }
        var fn = foo()
        fn()  //調(diào)用的方式有關(guān)系蔑匣,獨立調(diào)用。

規(guī)則二:隱式綁定棕诵。
永遠(yuǎn)指向調(diào)用這個函數(shù)的對象裁良。
object對象會被js引擎綁定到fn函數(shù)中的this里面

// 案例一:
            function foo(){
                console.log(this)
            }
            var obj = {
                name:'why',
                foo:foo
            }
            obj.foo()
        //案列二:
            var obj ={
                name:'xuan',
                eating:function(){
                    console.log(this.name + "在吃東西")
                }
            }
            obj.eating()  //xuan在吃東西
            var fn = obj.eating    
            fn() //   在吃東西   默認(rèn)調(diào)用,指向window
        //案例三:
            var obj1 = {
                name:'obj1',
                foo:function(){
                    console.log(this.name)  //obj2
                }
            }
            var obj2 = {
                name:'obj2',
                bar:obj1.foo
            }
            obj2.bar() //不管調(diào)用過程是怎樣的校套,只要是通過對象調(diào)用起來的价脾,就指向這個對象

規(guī)則三:顯式綁定(call,apply,bind)

call和apply的使用:

在隱式綁定中,必須在調(diào)用的對象內(nèi)部有一個對函數(shù)的引用笛匙,那如果不想在這個對象內(nèi)部引用函數(shù)侨把,那就必須通過call或apply來改變this指向。如下圖妹孙。obj中沒有引用函數(shù)座硕,可以通過call或apply來改變指向。

var name = 'xuan'
        var obj = {
            name:'obj'
        }
        function sum(){
            console.log(this.name)
        }
        sum() //xuan
        sum.call(obj) //obj
        sum.apply(obj) //obj

bind的使用:
如下call要多次使用需每次都通過call來綁定涕蜂,而bind只需要直接調(diào)接收的這個變量即可华匾。
如下涉及到優(yōu)先級問題,隱式綁定大于window優(yōu)先級机隙,所以可以直接newFoo()

var obj ={name:'aa'}
        function foo(){
            console.log(this)
        }
        foo.call(obj) 
        foo.call(obj) 
        foo.call(obj) 
        foo.call(obj) 
        foo.call(obj) 
        foo.call(obj) 
        var newFoo = foo.bind(obj) 
        newFoo()
        newFoo()
        newFoo()
        newFoo()
        newFoo()
        newFoo()  

call與apply的區(qū)別:

區(qū)別就在于傳參方式不一樣蜘拉,call是逗號分隔傳,apply是存放到數(shù)組中一塊傳

var name = 'xuan'
        var obj = {
            name:'obj'
        }
        function sum(num1,num2,num3){
            console.log(num1 + num2 + num3,this.name)
        }
        sum.call(obj,1,2,3)  //6 'obj'
        sum.apply(obj,[1,2,3]) //6 'obj'

call,apply 與bind 的區(qū)別 :

call和apply可以直接進(jìn)行改變有鹿,而bind必須有一個變量來接收才行

foo.call(obj)
        foo.apply(obj)
        //bind
        var newFoo = foo.bind(obj)
        newFoo()

規(guī)則四:new綁定

我們通過一個new關(guān)鍵字調(diào)用一個函數(shù)時(構(gòu)造器)旭旭,這個時候this是在調(diào)用這個構(gòu)造器時創(chuàng)建出來的對象,this = 創(chuàng)建出來的對象

function Person(name,age){
            this.name = name
            this.age = age
        }
        var p1 = new Person('xuan',15)
        var p2 = new Person('xiang',16)
        console.log(p1.name,p1.age)   //xuan 15
        console.log(p2.name,p2.age)  //xiang 16

------------------------------------其他地方使用this的解析:----------------------------------------------
一葱跋、setTimout中的this:

//普通函數(shù)中的this是window
      setTimeout(function(){
          console.log(this) //window
      },1000)
      
      //箭頭函數(shù)中的this是由上級作用域來指向
      setTimeout(()=>{
          console.log(this) //window
      },1000)

二持寄、監(jiān)聽點擊事件中的this
操作dom事件中的this指向當(dāng)前操作的dom元素

<div class="box"></div>
  <script>
      var box = document.querySelector('.box')
      box.onclick = function(){
          console.log(this)  //<div class="box"></div>
      }
  </script>

三、數(shù)組高階函數(shù)中this
高階函數(shù)中this默認(rèn)指向window,可以有第二個參數(shù)娱俺,第二個參數(shù)就是改變當(dāng)前this的指向到它稍味。

var names = ['abc','cba','nba']
        names.forEach(function(item){
            console.log(this) //window
        })
        names.map(function(item){
            console.log(this) //aaa
        },'aaa')

-------------------------------------------------------------綁定規(guī)則優(yōu)先級----------------------------------------------------------
1、默認(rèn)規(guī)則下優(yōu)先級最低
2荠卷、顯式綁定>隱式綁定
call和apply:

var obj = {
            name:'obj',
            foo:function(){
                console.log(this)
            }
        }
        obj.foo() //obj
        obj.foo.call('abc')  //abc
        obj.foo.apply('abc')  //abc1

bind:

// 案例一
        var obj = {
            name:'obj',
            foo:function(){
                console.log(this)
            }
        }
        var bar = obj.foo.bind('cba') //cba
        bar()
        // 案例二
        function foo(){
            console.log(this)
        }
        var obj = {
            name:'obj',
            foo:foo.bind('aaa')
        }
        obj.foo() // aaa

3模庐、new綁定 > 隱式綁定

var obj = {
            name:'obj',
            foo:function(){
                console.log(this) // foo{}
            }
        }
        var f = new obj.foo()

4、new 顯式綁定
new關(guān)鍵字不能和call/apply綁定,只能和bind一起用油宜。
new > bind

       function foo(){
            console.log(this) // foo{}
        }
        var bar = foo.bind('aaa')
        var obj = new bar()

-------------------------------------------------------------thsi規(guī)則之外----------------------------------------------------------
一掂碱、忽略顯示綁定
當(dāng)在顯示綁定中將它指向unll或undefined中時指向的是window

function foo(){
            console.log(this)
        }
        var obj = {
            name:'why'
        }
        foo.call(null)   //window
        foo.apply(undefined) //window
        var bar = foo.bind(null) //window
        bar()

二怜姿、箭頭函數(shù)中this
箭頭函數(shù)中的this指向的是外層作用域使用的this。

var name = 'xxx'
        var obj = {
            name:'xuan',
            getData:function(){
                setTimeout(function(){
                    console.log(this.name) //xxx
                },1000)
                setTimeout(()=>{
                    console.log(this.name)  //xuan
                },1000)
            }
        }
        obj.getData()

注:對象是沒有作用域的疼燥,所以下邊this.name指向的并不是person中的name沧卢,而是再外層的window

var name = 'window'
        var person = {
            name:'person',
            foo:()=>{
                console.log(this.name)
            }
        }
        person.foo()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市醉者,隨后出現(xiàn)的幾起案子但狭,更是在濱河造成了極大的恐慌,老刑警劉巖湃交,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熟空,死亡現(xiàn)場離奇詭異藤巢,居然都是意外死亡搞莺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門掂咒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來才沧,“玉大人,你說我怎么就攤上這事绍刮∥略玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵孩革,是天一觀的道長岁歉。 經(jīng)常有香客問我,道長膝蜈,這世上最難降的妖魔是什么锅移? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮饱搏,結(jié)果婚禮上非剃,老公的妹妹穿的比我還像新娘。我一直安慰自己推沸,他們只是感情好备绽,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鬓催,像睡著了一般肺素。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宇驾,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天压怠,我揣著相機(jī)與錄音,去河邊找鬼飞苇。 笑死菌瘫,一個胖子當(dāng)著我的面吹牛蜗顽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雨让,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼雇盖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栖忠?” 一聲冷哼從身側(cè)響起崔挖,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庵寞,沒想到半個月后狸相,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡捐川,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年脓鹃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片古沥。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘸右,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岩齿,到底是詐尸還是另有隱情太颤,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布盹沈,位于F島的核電站龄章,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乞封。R本人自食惡果不足惜做裙,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歌亲。 院中可真熱鬧菇用,春花似錦、人聲如沸陷揪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悍缠。三九已至卦绣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間飞蚓,已是汗流浹背滤港。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溅漾。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓山叮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親添履。 傳聞我的和親對象是個殘疾皇子屁倔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • JavaScript 中的作用域是詞法作用域。而JavaScript中的 this 卻更加類似于 動態(tài)作用域的機(jī)制...
    了凡和纖風(fēng)閱讀 188評論 0 0
  • 現(xiàn)在了解了函數(shù)調(diào)用中this綁定的四條規(guī)則暮胧,需要做的是找到函數(shù)的調(diào)用位置并判斷應(yīng)用了哪條規(guī)則锐借。如果調(diào)用位置應(yīng)用多條...
    李友勝閱讀 532評論 0 2
  • 對于 JavaScript 新手來說钞翔,this 是非常基礎(chǔ)同時也難以理解的知識點席舍。 比如下面的代碼布轿,this 指向...
    嗯哼_(dá)9793閱讀 228評論 0 0
  • 每個函數(shù)的this是在調(diào)用時被綁定的,完全取決于函數(shù)的調(diào)用位置(也就是函數(shù)的調(diào)用方法) 調(diào)用位置 在理解this的...
    李友勝閱讀 252評論 0 0
  • this 的四種綁定策略( 默認(rèn)綁定俺亮、隱式綁定驮捍、顯式綁定疟呐、new 綁定 ) 默認(rèn)綁定:this 一般默認(rèn)指向全局作...
    南航閱讀 1,864評論 0 0