首页 > 解决方案 > 未捕获的 ReferenceError:未定义 helloSpeaker

问题描述

我是 JavaScript 新手,正在尝试编写一些代码,但我无法让它工作。我也定义了 jQuery,但它并没有解决问题。它说:

未捕获的 ReferenceError:未定义 helloSpeaker

(function(window) {
  var helloSpeaker = {};
  helloSpeaker.speak = function(name) {
    console.log(speakWord + " " + helloSpeaker.name);
  }
  var speakWord = "Hello";
  window.helloSpeaker = helloSpeaker;
}(window));

//script.js
(function() {
  var names = ["Yaakov", "John", "Jen", "Jason", "Paul", "Frank", "Larry", "Paula", "Laura", "Jim"];
  for (var i = 0; i < names.length; i++) {
    var firstLetter = names[i].charAt(0).toLowerCase();
    if (firstLetter === 'j') {
      byeSpeaker.speak(names[i]);
    } else {
      helloSpeaker.speak(names[i]);
    }
  }
})();
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Module 4 Solution Starter</title>
  <script src="SpeakHello.js"></script>
  <script src="SpeakGoodBye.js"></script>
  <script src="script.js"></script>
  <script language="JavaScript" type="text/javascript" src="js/jquery-3.5.1.min.js"></script>
</head>
<body></body>
</html>

标签: javascripthtmljquery

解决方案


您只想访问传入的name 参数,您可以使用 just name, not helloSpeaker.name

(function(window) {
  var helloSpeaker = {};
  helloSpeaker.speak = function(name) {
    console.log(speakWord + " " + name);
  }
  var speakWord = "Hello";
  window.helloSpeaker = helloSpeaker;
}(window));

//script.js
(function() {
  var names = ["Yaakov", "John", "Jen", "Jason", "Paul", "Frank", "Larry", "Paula", "Laura", "Jim"];
  for (var i = 0; i < names.length; i++) {
    var firstLetter = names[i].charAt(0).toLowerCase();
    if (firstLetter === 'j') {
      //byeSpeaker.speak(names[i]);
    } else {
      helloSpeaker.speak(names[i]);
    }
  }
})();
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Module 4 Solution Starter</title>
  <script src="SpeakHello.js"></script>
  <script src="SpeakGoodBye.js"></script>
  <script src="script.js"></script>
  <script language="JavaScript" type="text/javascript" src="js/jquery-3.5.1.min.js"></script>
</head>
<body></body>
</html>

此外,将新属性和方法附加到window(全局)对象是不好的做法,因此除非您有某些特殊原因,否则应避免这样做。


推荐阅读