Как написать функцию для вызова другой функции N-й раз в JavaScript без использования цикла for или while? - PullRequest
0 голосов
/ 20 сентября 2019

Я новичок в кодировании и столкнулся с трудностью, на которую, похоже, не могу найти ответ ... Я пытаюсь написать функцию, которая будет вызывать другую функцию n-е число раз.Я знаю, что при работе с этим типом данных это сложнее, чем с числом или строкой.

console.group("3 Times");
var hello = function(){
    console.log("Hello World!");
}
function call3Times(func) { 
    func(); 
    func(); 
    func(); 
}
function nthTimes(n, func){
    var hello = func;
    var nthHello = console.log(hello.repeat(n));
   return nthHello
}
call3Times(hello);
nthTimes(5, hello());
console.groupEnd();

, поэтому я продолжаю получать, что повтор не может быть запущен для неопределенной переменной.Я знаю, что в этом случае функция ссылается не на переменную, а на саму функцию, которую она будет рассматривать как ссылку.Так как бы мне обойти это?

Ответы [ 7 ]

1 голос
/ 20 сентября 2019

Как отмечали другие:

  • цикл for - это путь.Однако в комментариях вы упоминаете, что не следует использовать цикл for.В этом случае вы можете использовать рекурсию.
  • Функции не имеют метода repeat.
  • Вы вызвали свой метод nthTimes с неверным вторым аргументом: он долженbe hello (объект функции), а не возвращаемое значение одного hello() выполнения: поэтому без скобок:

    nthTimes(5, hello);
    

function nthTimes(n, func) {
    if (n <= 0) return; // Don't call function (end recursion)
    func(); // call it once, ...
    nthTimes(n-1, func); // ...and n-1 times
};

var hello = function() {
    console.log("Hello World!");
}

nthTimes(5, hello);

Альтернатива с .repeat

Поскольку вы использовали синтаксис .repeat(), вот альтернатива, которая делает это возможным.Функция repeatable определяет метод repeat для данной функции.В этой альтернативе я также добавил поддержку для предоставления аргументов и использования объекта this:

function repeatable(func) {
    // add a property to the function object; a new method for it:
    func.repeat = function (n, ...args) {
        if (n <= 0) return; // Don't call function (end recursion)
        func.call(this, ...args); // call it once, ...
        func.repeat(n-1, ...args); // ...and n-1 times
    };
    // The given function object is extended, but let's also return it 
    return func;
}

var hello = repeatable(function() {
    console.log("Hello World!");
});

hello.repeat(5);
1 голос
/ 20 сентября 2019

Прежде всего, добро пожаловать на сайт и добро пожаловать в программирование

Вы захотите проверить то, что называется для цикла .Это утилиты в программировании, которые позволяют вам повторять строку или строки кода, пока не будет выполнено определенное условие.

Например, в вашем сценарии вы могли бы написать

function nthTimes(n, func){
    for (var i = 0; i < n; i++) {
      func();
    }
}

Также стоит отметить, что когда вы делаете строку nthTimes(5, hello());, используя hello(), вы передаете результат функции hello вместо ссылки на функцию.Вместо этого должно быть nthTimes(5, hello);.

Пожалуйста, не стесняйтесь спрашивать, хотите ли вы, чтобы я уточнил подробнее


Обновление

Вот краткая демонстрация дляВы

console.group("n Times");

var hello = function() {
  console.log("Hello World!");
}

function nthTimes(n, func) {
  for (var i = 0; i < n; i++) {
    func();
  }
}

nthTimes(5, hello);
console.groupEnd();

Обновление 2: рекурсия

Согласно вашему комментарию ниже, этот метод устраняет необходимость использовать цикл, использующий концепцию рекурсия .Смотрите приведенный ниже фрагмент кода для обновленного примера

function nthTimes(n, func){
    if (n < 1) return; // don't process if we don't have to
    
    func(); // call your function
    
    n = n - 1; // decrement the count
    
    nthTimes(n, func); // call this function again with new n
}

function hello() {
  console.log("Hi there");
}

nthTimes(5, hello);

Здесь следует отметить, что ваша функция вызывает сама себя.Поэтому, если вы вызываете nthTimes с n = 2, вызывается функция func (в этом примере вызывается hello()), и вы уменьшаете n на единицу, чтобы учесть вызов.Затем вы вызываете функцию nthTimes снова , но на этот раз с n = 1.Наконец, когда функция вызывается с n = 0, вызов return останавливает функцию раньше, чем вызывается func(), и дальнейшие вычисления не выполняются.Я проверил значение n в верхней части моей функции, чтобы, если бы пользователь вводил число меньше 1, переданная функция не вызывалась.

0 голосов
/ 20 сентября 2019

// @ Dayman3030 - это то, чего вы пытаетесь достичь?

console.group("3 Times");

var hello = function(){
    return "Hello World! ";
}

function call3Times(n=3, func) { 
    for (var i = 0; i < n; i++) {
      console.log(func());
 }
}

function nthTimes(n=3, func){
    var hello = func();
    var nthHello = hello.repeat(n);
    return console.log(nthHello);
}

call3Times(5, hello);
nthTimes(5, hello);
console.groupEnd();
0 голосов
/ 20 сентября 2019

Согласно https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat:

Метод repeat () создает и возвращает новую строку, содержащую указанное количество копий строки, для которой он был вызван, объединенную вместе.

Это означает, что он используется с String объектами, и он будет принимать одну строку и повторять ее n раз, сохраняя результат в виде строки.

Вот пример использованияфункция .repeat ():

var hello = "Hello World";

var repeated = hello.repeat(5);

console.log(repeated);
//expected output: > "Hello WorldHello WorldHello WorldHello WorldHello World"

Обратите внимание, что между каждым повторяющимся hello нет пробелов - это потому, что в конце hello нет пробела, и он повторяется точно.

Для многократного повторения функции вы можете использовать цикл for:

function nthTimes(n, func) {
  for (var i = 0; i < n; i++) {
    func(); 
  }
}

function hello() {
console.log("Hello World");
}

nthTimes(5, hello);
//expected output: > "Hello World" > "Hello World" > "Hello World" > "Hello World" > "Hello World"
0 голосов
/ 20 сентября 2019

Будет много подходов, которые успешно воспроизводят эффект, которого вы хотите достичь.

Ответ, который я дал ниже:

  • , написанный в синтаксисе ES2015+ ( «новые» версии javascript);и
  • использует callback (который является ссылкой на функцию, переданную в качестве параметра другой функции (т. е. вторая функция может получить доступ к первой функции)

// A FUNCTION I WANT TO CALL BACK LATER

const logHelloWorld = () => {

  console.log('Hello World!');
}


// MY MAIN FUNCTION

const runFunctionRepeatedly = (callback, numberOfTimes) => {

  for (let i = 0; i < numberOfTimes; i++) {

    callback();    
  }
}


// CALLING MY MAIN FUNCTION

runFunctionRepeatedly(logHelloWorld, 3);
0 голосов
/ 20 сентября 2019
var hello = function(){
    console.log("Hello World!");
}
function nthTimes(n, func){
    for(let i = 0; i < n; i++) {
       func()
    }
}

nthTimes(5, hello);

Пояснение

nthTimes(5, hello()); выполнение этого на самом деле выполняет функцию hello и передает значение, возвращенное функцией hello, в nthTimes.Вместо этого попробуйте nthTimes(5, hello);, так что вы только передаете ссылку на функцию hello, которую вы можете вызвать позже, используя func()

0 голосов
/ 20 сентября 2019

У меня есть функция, которую я продолжаю переписывать, которая называется times (на основе старой функции PrototypeJS Number # times ).Звучит так, будто он сделает то, что вам нужно.

function toPosInt(number) {
    return Math.floor(Math.abs(number));
}

function times(number, handler, context) {

    let posInt = toPosInt(number) || 0;
    let i = 0;

    while (i < posInt) {

        handler.call(context, i);
        i += 1;

    }

    return posInt;

}

Затем вы бы назвали его, как и любая другая функция.

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