首頁  >  問答  >  主體

javascript - js call的一個問題,很簡單的程式碼,輸出結果如何解釋?

foo2()採用了箭頭函數。
依照對call的理解,foo.call({id:23})應該輸出23,而不是0。所以,誰能解釋一下嗎?
程式碼如下:
<script type="text/javascript">

    function foo() {
        setTimeout(function (){
            console.log('id1:', this.id);
        }, 100);
    }
    
    function foo2() {
        setTimeout(() => {
            console.log('id2:', this.id);
        }, 100);
    }
    
    var id = 0;
    foo.call({id:23});
    foo2.call({id: 2});

</script>

執行結果:
0
2

phpcn_u1582phpcn_u15822648 天前685

全部回覆(6)我來回復

  • 迷茫

    迷茫2017-06-26 10:52:10

    foo 函數裡面的this 還是{id:23} 但是到了setTimeout 接受的回掉裡面, this 就變為了window箭頭函數,thisfoo2this 綁定,所以是2

    回覆
    0
  • typecho

    typecho2017-06-26 10:52:10

    foo2的setTimeout的參數是一個箭頭函數,裡面的this,綁定定義時所在的作用域(foo2執行的時候,this是call中物件),而不是指向執行時間所在的作用域。普通的setTimeout中的函數綁定的是運行時作用域(window)。

    回覆
    0
  • 代言

    代言2017-06-26 10:52:10

    1、foo函數的this是window,foo2函數的this是{id: 2}這個物件。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-06-26 10:52:10

    很明顯,第一個this指向的是window,而第二個箭頭函數this指向當前對象,也就是說誰調用,就指向誰;
    第一個可以改下解決下:

        function foo() {
            var _this = this;
            setTimeout(function (){
                console.log('id1:', _this.id);
            }, 100);
        }
        var id = 0;
        foo.call({id:23});

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

    曾经蜡笔没有小新2017-06-26 10:52:10

    1、setTimeout中的回呼函數在foo執行100ms後執行,執行階段的作用域是window。
    2、箭頭函數可以讓setTimeout裡面的this,綁定定義時所在的作用域,而不是指向執行時所在的作用域。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-26 10:52:10

    箭頭函數作用域的問題

    回覆
    0
  • 取消回覆