鍍金池/ 問(wèn)答/HTML/ 這段代碼的輸出結(jié)果為什么是"aa","aaa&qu

這段代碼的輸出結(jié)果為什么是"aa","aaa","aaaa",而不是"ba","baa","baaa"呢??希望各位同學(xué)解答一下

var obj = {

        escape: function (str) {
            return str.replace("a", "b");
        },
        
        func: function () {
        
            for (var i = 0; i < 3; ++i) {
                var str = "a";
                setTimeout(function () {
                    str = str + "a";
                    console.log(this.escape(str));
                }, i * 1000);
            }
            
        }
        
    };

    obj.func();
回答
編輯回答
毀憶

函數(shù)體內(nèi)的this具體指向什么和調(diào)用方式有關(guān)系,如果作為對(duì)象的屬性調(diào)用,那么this就會(huì)指向這個(gè)對(duì)象,如果是作為普通函數(shù)調(diào)用,非嚴(yán)格模式下是window,嚴(yán)格模式下是undefined。箭頭函數(shù)是往上找最近的上下文中的this

function () {
  str = str + "a";
  console.log(this.escape(str));
}

上面的函數(shù)就是作為普通函數(shù)被調(diào)用的,所以this指向window,所以調(diào)用的實(shí)際是window.escape。如果想要使用上下文中的this,可以改成箭頭函數(shù),代碼如下:

var obj = {
  escape: function (str) {
    return str.replace("a", "b");
  },  
  func: function () {  
    for (var i = 0; i < 3; ++i) {
      var str = "a";
      setTimeout(() => {
        str = str + "a";
        console.log(this.escape(str));
      }, i * 1000);
    }     
  }  
};
2017年2月24日 20:34
編輯回答
空白格

在MDN的文檔中,你可以看到關(guān)于setTimeout 方法里 this 的指向這個(gè)問(wèn)題,有這么一句話:

由setTimeout()調(diào)用的代碼運(yùn)行在與所在函數(shù)完全分離的執(zhí)行環(huán)境上。

所以在 console.log(this.escape(str)) 這里,this 指向的是 Window 對(duì)象,而 Window.escape()干的事情是這樣的。

所以,你的代碼壓根就沒(méi)有調(diào)用你想調(diào)用的 escape 方法。

2017年3月11日 10:01
編輯回答
爆扎
var obj = {

        escape: function (str) {
            return str.replace("a", "b");
        },
        
        func: function () {
        
            for (var i = 0; i < 3; ++i) {
                var str = "a";
                setTimeout(() => {
                    str = str + "a";
                    console.log(this.escape(str));
                }, i * 1000);
            }
            
        }
        
    };

    obj.func();

改成箭頭函數(shù),可以避免this的綁定問(wèn)題。

2017年5月25日 17:09