Как я могу вызвать функцию из другой функции внутри класса - PullRequest
0 голосов
/ 03 апреля 2019

У меня следующая проблема: я хочу вызвать функцию printHello из функции testHello. Функция printHello работает сама по себе, однако, когда я пытаюсь вызвать printHello из функции testHello, я получаю ошибку ссылки. Спасибо за помощь.


class Test {
  constructor(name) {
    this.name;
  }

  printHello(parameter) {
    console.log(parameter);
  }

  testHello() {
    printHello(printHello(this.name));
  }

}
var test = new Test("Sandro");
test.printHello("hello"); //works, prints "Hello" to the Console 
test.testHello(); // does not work: Reference Error: printHello is not defined

Ответы [ 4 ]

5 голосов
/ 03 апреля 2019

Используйте ключевое слово this. Кроме того, у вас было несколько ошибок (я их прокомментировал)

class Test{
    constructor(name){
        this.name = name; // <- you need to assign the `name` to `this.name`
    }

    printHello(parameter){
        console.log(parameter);
    }

    testHello(){
        this.printHello(this.name); // <- you had double invocation here
    }

}
var test = new Test("Sandro");
test.printHello("hello");   //works, prints "Hello" to the Console 
test.testHello();  // does not work: Reference Error: printHello is not defined
0 голосов
/ 03 апреля 2019

class Test {
  constructor(name) {
    this.name = name;
  }

  printHello(parameter) {
    console.log(parameter);
  }

  testHello() {
    this.printHello(this.name);
  }

}
var test = new Test("Sandro");
test.printHello("hello"); //works, prints "Hello" to the Console 
test.testHello(); // does not work: Reference Error: printHello is not defined

var test определен на глобальном уровне. Это возвращает объект, который содержит свойство name. В прототипах мы видим функции constructor, printHello и testHello. Теперь, когда вы вызываете //test.printHello//, это будет работать без проблем. Зачем? когда функция не на том же уровне, то она будет переходить к прототипам, пока не встретит функцию. В прототипе вы можете увидеть функцию printHello. Это вызов прототипа наследования.

Теперь, что происходит в //test.testHello()//. javaScript пытается выполнить это и увидеть другую функцию внутри этого. Поэтому он попытается найти, где определена эта функция printHello!

Теперь нам нужно знать о лексической среде. Проверьте этот образец,

    var test = 'hello' ; 
    function foo(){
       var test = 'world'
       console.log(test)
    }

Теперь, что произойдет, если вы вызовете foo ()? это будет console.log 'world',

Теперь я удаляю test var из функции

    var test = 'hello' ; 
    function foo(){
       console.log(test)
    }

Теперь давайте вызовем foo (); На выходе будет 'привет'

  1. Когда функция выполняется, javascript пытается найти тестовую переменную. О, это на том же уровне. Другими словами, функциональный уровень. Теперь javaScript знает значение test, поэтому он будет выполнять console.log ();
  2. На этот раз javascript попытается найти тестовую переменную. ммм, это не внутри того же уровня. (функциональный уровень). Без проблем. Давайте посмотрим, где определена эта функция. О, это определено на глобальном уровне. Хорошо, теперь я найду этот тестовый вариант на глобальном уровне. ах, вот оно. его значение 'привет'

То же самое происходит с вашим кодом. Как только javascript пытается выполнить test.testHello (), он видит printHello () внутри этой функции. Теперь он попытается найти функцию на том же уровне. Он не определен ни в функции testHello (), ни внутри прототипов testHello (). Итак, теперь javaScript пытается выяснить, где определена эта функция testHello (). Это на глобальном уровне, потому что var test определяется на глобальном уровне. Определяется ли этот printHello () на глобальном уровне? НЕТ! Он находится внутри прототипа этого объекта. Теперь javaScript не может найти функцию printHello на глобальном уровне. Так что будет выдано сообщение об ошибке, что выражение printHello () не определено. Ключевое слово this поможет вам обратиться к объекту, которому оно принадлежит. Проще говоря, с помощью ключевого слова this, пожалуйста, проверьте прототип тестового объекта перед поиском на глобальном уровне. (обратите внимание, что не в прототипах testHello (), а в прототипе тестового объекта)

Важно понимать, что функции на самом деле не являются функциями. Это объекты в javaScript !!! Используйте ключевое слово this. Это поможет. Также попробуйте узнать о наследовании прототипа и лексической среде.

0 голосов
/ 03 апреля 2019

Пара проблем в коде, которые могут быть легко исправлены.

1) Вам необходимо установить свойство this.name в конструкторе.

2) Вы хотите добавить префикс к printHello в testHello с помощью this.

class Test {
  constructor(name) {
    //You need to actually set this.name to the parameter value
    this.name = name;
  }

  printHello(parameter) {
    console.log(parameter);
  }

  testHello() {
    //this keyword is needed to prefix the method name
    this.printHello(this.name);
  }
}

//Now below should work with no issues
var test = new Test("Sandro");
test.printHello("hello");
test.testHello();
0 голосов
/ 03 апреля 2019

Возможно, вам нужно вызвать

this.printHello(this.name);

внутри вашей функции testHello.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...