2015-06-22 41 views
2

在Chrome Canary和Node.js 0.12.3中,以下代碼打印p爲什麼使用--harmony在Node.js中引發錯誤?

'use strict'; 
    let o = { 
    name: 'o', 
    foo: function() { 
     ['1'].map(function() { 
      console.log(this.name); 
     }.bind(this)); 
    }, 
    }; 

    let p = { name: 'p' }; 

    o.foo.call(p); // p 

在Chrome Canary中,以下代碼還打印出p。但爲什麼它會拋出一個類型錯誤在Node.js 0.12.3與--harmony標誌?

'use strict'; 
    let o = { 
    name: 'o', 
    foo: function() { 
     ['1'].map(() => { 
      console.log(this.name); 
     }); 
    }, 
    }; 

    let p = { name: 'p' }; 

    o.foo.call(p); // p in Chrome, TypeError in Node.js with --harmony 

換句話說,爲什麼當第二代碼片段在Node.js的運行thisundefined

+3

箭頭函數在node/io中被破壞https://github.com/nodejs/io.js/issues/735 –

+1

這幾乎肯定是由於Canary使用的是最新版本的v8而不是節點是(因爲Canary故意出血,而Node則試圖保持穩定)。 – apsillers

回答

2

這簡直就是iojs和節點使用的due to a bug in the version of the V8 engine。 Chrome Canary使用解決此問題的不穩定版本的V8。當這個固定版本推出到穩定版本的V8時,node/iojs應該以同樣的方式工作。

現在,您可以使用像babel這樣的工具來轉儲您的代碼。使用babel對你的代碼沒有任何標誌transpiles到:

function foo() { 
    var _this = this; 

    ['1'].map(function() { 
    console.log(_this.name); 
    }); 
} 

這確實打印p

相關問題