简体   繁体   中英

This code keeps returning 'undefined' for (names[i]). what am I doing wrong?

This code keeps returning 'undefined' for (names[i]). When I console.log() it loops through the array and prints Hello (names[i]) or Good Bye (names[i])what am I doing wrong?

 (function (window) { var helloSpeaker = {}; helloSpeaker.name = " "; var speak = "Hello"; helloSpeaker.speak = function () { console.log(speak + helloSpeaker.name); } window.helloSpeaker = helloSpeaker; })(window); (function (window) { var byeSpeaker = {}; byeSpeaker.name = " " var speak = "Good Bye" byeSpeaker.speak = function () { console.log(speak + byeSpeaker.name); } window.byeSpeaker = byeSpeaker; })(window); (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') { console.log(byeSpeaker.speak(names[i])); } else { console.log(helloSpeaker.speak(names[i])); } } })();

You got undefined because you call:

console.log(byeSpeaker.speak(names[i]));
console.log(helloSpeaker.speak(names[i]));

But its return nothing. That's why you got undefined. You can fix it. Just call the function, not log it. Like that:

byeSpeaker.speak(names[i]))    
helloSpeaker.speak(names[i])

Hope you got it. Thank You

Your issue is that you're passing the name in as an argument to the speak function, however, in your definition of speak it doesn't take an argument at all.

You can fix it by defining it like this:

helloSpeaker.speak = function (name) {
  console.log(speak + name);
}
byeSpeaker.speak = function (name) {
   console.log(speak + name);
}

Also, here I cleaned up the logic for you.

(function () {
  class Speaker {
    constructor(greeting) {
      this.greeting = greeting;
    }
    speak(name) {
      return `${this.greeting}, ${name}`;
    }
  }

  const helloSpeaker = new Speaker('Hello');
  const byeSpeaker = new Speaker('Bye');

  const names = [
    'Yaakov',
    'John',
    'Jen',
    'Jason',
    'Paul',
    'Frank',
    'Larry',
    'Paula',
    'Laura',
    'Jim',
  ];

  names.forEach((name) => {
    const firstLetter = name.charAt(0).toLowerCase();
    const result = firstLetter === 'j' ? byeSpeaker.speak(name) : helloSpeaker.speak(name);
    console.log({result});
  });
})();

Your other issue is that your speak function wasn't returning anything, it was returning undefined implicitly.

example:

function noReturn() {
  console.log('inside noReturn')
  // no return statement, so implicitly it's as though you wrote:
  // return undefined;
}

console.log('noReturn result:', noReturn())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM