运行JS图书馆功能代码报Uncaught ReferenceError: Book1未定义问题
错误原因
- 作用域不匹配:
Book1/Book2/Book3是在addBookToLibrary函数内部的newBook方法里用const声明的块级作用域变量,全局作用域下无法直接访问,你在全局执行myLibrary.push(Book1, Book2, Book3)自然会提示变量未定义。
- 作用域不匹配:
- 构造函数调用逻辑错误:实例化书籍对象需要调用你提前定义的
Book构造函数,你写的new Book1()完全把实例名和构造函数搞反了,Book1是你要创建的实例,不是构造函数,同理Book2/Book3的实例化写法全错。
- 构造函数调用逻辑错误:实例化书籍对象需要调用你提前定义的
- 关键字拼写错误:JS中
this是全小写关键字,你写的大写This会被识别为未定义的变量,直接报错。
- 关键字拼写错误:JS中
- 函数未执行:你定义了
addBookToLibrary之后没有主动调用,里面的newBook方法也没有执行逻辑,就算作用域没问题,三个书籍实例也不会被创建。
- 函数未执行:你定义了
- 参数传递错误:
Book3实例创建时你把author/pages/read三个参数塞到了同一个字符串里,不符合Book构造函数的入参要求。
- 参数传递错误:
info方法返回逻辑错误:return name, author, pages, read的写法只会返回最后一个参数read,如果要返回完整信息需要拼接为字符串或者返回对象。
修正后可运行代码
let myLibrary = []; function Book(name, author, pages, read) { this.name = name; this.author = author; this.pages = pages; this.read = read; this.info = function () { return `${this.name} | ${this.author} | ${this.pages}页 | ${this.read}`; }; } function addBookToLibrary() { // 直接创建实例并推入数组,不需要额外嵌套无用的newBook方法 const Book1 = new Book( "Rich Dad, Poor Dad", "Robert Kiyosaki", "235", "Read" ); const Book2 = new Book("One Piece", "Eiichiro Oda", "23456", "Not Read"); const Book3 = new Book("Bone", "Jeff Smith", "2352", "Not Read"); myLibrary.push(Book1, Book2, Book3); } // 先调用方法完成书籍实例创建和入队 addBookToLibrary(); // 遍历输出 for (let i in myLibrary) { console.log(myLibrary[i].info() + " "); }
内容的提问来源于stack exchange,提问作者Qwop
相关产品推荐
相关产品推荐

