搜尋

首頁  >  問答  >  主體

javascript - 這段程式碼如何理解?

var name = "123";

    var object = {
        name: "My Object",
        getNameFunc: function() {
            return this.name;
        }
    }
    console.log(object.getNameFunc());                            //My Object
    console.log((object.getNameFunc)());                        //My Object
    console.log((object.getNameFunc = object.getNameFunc)());    //123

為啥最後輸出的是123? object.getNameFunc = object.getNameFunc是什麼意思?

扔个三星炸死你扔个三星炸死你2819 天前596

全部回覆(3)我來回復

  • 为情所困

    为情所困2017-06-26 10:57:12

    看錯問題了,那我重新解釋。

    首先看 object.getNameFunc,它的定義是

    function () {
      return this.name
    }

    當你這樣寫的時候 object.getNameFunc = object.getNameFunc 的時候,其實可以看成是這樣的。

    object.getNameFunc = function () {
      return this.name
    }

    其實在做這樣一個事情的時候,this 已經不是 object 了。而是 window(在瀏覽器裡)了。所以輸出的是外面的 name

    大概是這樣= =

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-06-26 10:57:12

    賦值運算結果是左值。

    因此
    (object.getNameFunc = object.getNameFunc)()
    可以認為是:

    var f = (object.getNameFunc = object.getNameFunc); 
    f(); 

    因此 this 指向全局了 所以得到 123

    回覆
    0
  • 天蓬老师

    天蓬老师2017-06-26 10:57:12

    var name = "123";
    
    var obj = {
        name: "My Object",
        getNameFunc: function() {
            return this.name;
        }
    }
    console.log(obj.getNameFunc());                            //My Object
    console.log((obj.getNameFunc)());                        //My Object
    console.log((obj.getNameFunc = obj.getNameFunc)());    //123
    console.log((obj.getNameFunc = obj.getNameFunc));      

    從this引用結果來看,肯定是this是指向全局了,可能中間有些環節沒搞明白。
    我們在後面加一段程式碼,就能知道(obj.getNameFunc = obj.getNameFunc)這段內容是什麼了,沒錯,console出了一個函數,所以(obj.getNameFunc = obj.getNameFunc)這段語句執行結果就是一個函數,慣性思考導致我們總想當然認為這只是重賦值操作,認為依舊是obj來呼叫函數。
    其實當執行完語句後,這段函數其實是由全域物件呼叫的。

    回覆
    0
  • 取消回覆