首頁  >  問答  >  主體

javascript - 關於this的指向性問題

var foo = "window";
var obj = {
    foo : "obj",
    getFoo : function(){
        return function(){
            return this.foo;
        };
    }
};
var f = obj.getFoo();
console.log(f());  //结果:window

為什麼上述程式碼的運行結果是window呢?

天蓬老师天蓬老师2670 天前772

全部回覆(5)我來回復

  • 滿天的星座

    滿天的星座2017-06-28 09:27:33

    obj.getFoo() 回傳一個方程,賦值給了 f 。
    f 透過 f() 被調用,沒有明確的調用者,所以 this 就是 window

    想要的到 "obj" ,可以這樣做

    var foo = "window";
    var obj = {
        foo : "obj",
        getFoo : function(){
            var self = this;
            return function(){
                return self.foo;
            };
        }
    };
    
    var f = obj.getFoo();
    console.log(f());

    回覆
    0
  • 阿神

    阿神2017-06-28 09:27:33

    因為,在f()實際運行的地方,thiswindow,由於沒有通過call或者bind改變上下文,所以輸出的就是window

    可以依照以下替換方法:

    console.log(f());
    // ----->
    console.log(obj.getFoo());
    // ----->
    console.log(function() {
        var self = this;
        return function() {
            return self.foo
        }
    });

    這裡的self就是指向window了,所以return self.foo就是return window.foo,也就是'window'

    回覆
    0
  • 淡淡烟草味

    淡淡烟草味2017-06-28 09:27:33

    其實最簡單的理解就是obj.getFoo給了f,然後再看這方法運行的位置在哪.

    f = function () {
        return function () {
            return this.foo
        }
    }

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-28 09:27:33

    console.log(f())中f()是獨立被呼叫的
    1.如果呼叫者函數,被某一個物件所擁有,那麼該函數在呼叫時,內部的this指向該物件。
    2.如果函數獨立調用,那麼該函數內部的this,則指向undefined。
    推薦閱讀 http://www.jianshu.com/p/d647... 希望對你有幫助

    回覆
    0
  • PHP中文网

    PHP中文网2017-06-28 09:27:33

    函數執行,函數體內的this指向函數的呼叫方

    1、下面這段程式碼,getFoo函數的呼叫方是obj,所以getFoo函數內部的this指向obj物件

    var f = obj.getFoo()

    2、getFoo函數回傳了一個匿名函數賦給變數f,再執行函數f,此時變數f是掛載到window上的,函數f的呼叫方是window,函數f內部的this也指向window

    console.log(f());  //结果:window

    回覆
    0
  • 取消回覆