为什么这个javascript代码段不起作用?

Rez*_*eza 2 javascript ecmascript-6

我的以下代码正在运行,但是当我使用ES6语法时,它不再起作用了.请解释一下发生了什么?

此代码完全正常运行.

   function Library(){ this.books = [];};
   Library.prototype.addBook = function(book){ 
     this.books.push(book);
   };

   Library.prototype.getBook = function(index){ 
     return this.books[index];
   };

   var m = new Library();
   m.addBook('The Demon Haunted World');       
   m.getBook(0);
   // output will be like 'The Demon Haunted World'
Run Code Online (Sandbox Code Playgroud)

然后我在某种程度上改变了ES6的语法.然后代码看起来像这样:

   function Library(){ this.books = [];};
   Library.prototype.addBook = (book) => { 
     this.books.push(book);
   };

   Library.prototype.getBook = (index) => { 
     return this.books[index];
   };

   var m = new Library();
   m.addBook('The Demon Haunted World');
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?我收到以下错误:

    VM505:2 Uncaught TypeError: Cannot read property 'push' of undefined(…)
Run Code Online (Sandbox Code Playgroud)

Tha*_*var 5

this属于窗口,而不是Library构造函数.之所以发生这种情况,是因为箭头使用窗口对象或环境来处理binds上下文.lexicallyparent

   function Library(){ this.books = [];};
   Library.prototype.addBook = (book) => {
     console.log(this); //window
     this.books.push(book);
   };   
Run Code Online (Sandbox Code Playgroud)

通常在JS中,我们有两个上下文/范围[Global,Function].在您的情况下,arrow函数指向window contextnearest parent context.窗口.

  • ES6有...... ES5,它唯一的功能/全局...可能正在使用eval你可以创建动态上下文,而try/catch也有自己的范围...... (2认同)