在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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)系,如果作為對象的屬性調(diào)用,那么this就會指向這個對象,如果是作為普通函數(shù)調(diào)用,非嚴格模式下是window,嚴格模式下是undefined。箭頭函數(shù)是往上找最近的上下文中的this。

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

上面的函數(shù)就是作為普通函數(shù)被調(diào)用的,所以this指向window,所以調(diào)用的實際是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 的指向這個問題,有這么一句話:

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

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

所以,你的代碼壓根就沒有調(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的綁定問題。

2017年5月25日 17:09