搜尋

首頁  >  問答  >  主體

javascript - 關於Js中 this的一道題

var length = 10;

function cl() {
    console.log(this.length);
}

var o = {
    length: 20,
    show: function (fn) {
        fn();
        arguments[0]();
    }
}

o.show(cl); // 10 

關於這題 我想知道js中this不是誰調用就指向誰麼?為什麼 第一次呼叫 cl中的this還是指向window而不是o物件?我知道沒有用call估計就不對了,但是為什麼不對呢?
第二個有為什麼指向了arguments?

同時 這段程式碼在nodejs中運行時為什麼第一次輸出為undifined?

为情所困为情所困2741 天前989

全部回覆(5)我來回復

  • 巴扎黑

    巴扎黑2017-07-05 10:39:50

    1. 直接使用函數名字調用,無論你外麵包了多少層,調用者就是window

    2. 因為那個方括號運算符,方括號運算符作為物件取值運算,在某種意義上是可以等於點.運算符的,所以這裡在形式上其實可以類比成arguments.0() ,你看,這不就是arguments來呼叫了這個函數了嘛,所以運行的時候this就指向它了。

    回覆
    0
  • 欧阳克

    欧阳克2017-07-05 10:39:50

    this的指向不是在聲明的時候確定的而是在呼叫的時候被定義的有這麼多種情況

    1. 普通函數調用,this為全域物件或是undefined

    2. 作為物件的方法,this為那個物件

    3. new 表達式,this為以該函數為原型的新建立的物件

    4. 使用 apply/call指定 this

    5. 用bind綁定固定的this

    6. 事件處理函數中的this是當前的觸發事件的DOM元素(event.currentTarget)

    不知道對你有沒有幫助

    回覆
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-07-05 10:39:50

    就這題而言。

    1. o.show()執行,那麼show函數作用域裡面用到的this都指向o.
      但其實這裡是在裡面調用fn(), fn並不是o去調用的,沒有o.fn...一個比較low的原則就是函數呼叫點前面是誰,函數裡面的this是誰。 這裡肯定是預設的window了。

    2. arguments[0] ==> arguments.0
      數組也是對象,[]調用跟 . 同理,所以this就是arguments

    3. 關於node中,由於是模組化,this指向的是global,而且var 宣告的時候不會像瀏覽器中,有window呼叫。 node中是沒有這個機制的。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-07-05 10:39:50

    雷雷

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-07-05 10:39:50

    o.show()this指向o,但和本題無關。
    o.show()中的fn標識符解析得到一個引用類型(內部類型),其base屬性(本題中值為show()方法的活動對象)即是this的指向。因為活動物件回傳null,所以this指向null,從而指向了window
    arguments[0]()arguments[0]同樣回傳一個引用類型,其base屬性的值為arguments,所以this指向argumentsarguments

    。 🎜

    回覆
    0
  • 取消回覆