Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个javascript代码段不起作用?_Javascript_Ecmascript 6 - Fatal编程技术网

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

为什么这个javascript代码段不起作用?,javascript,ecmascript-6,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[in

我下面的代码正在工作,但当我使用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'
然后我在某种程度上改变了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');
为什么这不起作用?我得到以下错误:

    VM505:2 Uncaught TypeError: Cannot read property 'push' of undefined(…)

属于窗口,而不是
构造函数。之所以发生这种情况,是因为箭头函数
将上下文
与窗口对象或
父对象的环境绑定在一起

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

通常在JS中,我们有两个上下文/范围[Global,Function]。在您的情况下,
箭头
函数指向
窗口上下文
或最近的父上下文。
即窗口

可能重复因为这不代表您的对象您正确地发现了问题,但您的描述非常不准确。箭头函数中对
参数
超级
新建的引用。目标
始终解析为词汇封闭环境中的绑定。这就是全部。没有上下文,没有范围,没有窗口。顺便说一句,JS有两种以上的作用域:至少是全局、模块、函数、块和迭代作用域。。。ES5,其唯一功能/全局。。。可能正在使用eval,您可以创建动态上下文,并且try/catch有自己的作用域。。。