Временно заменить глобальную константу внутри функции - PullRequest
1 голос
/ 19 января 2020

Есть ли способ в Javascript временно заменить переменную, определенную во внешней области, но сохранить это значение только во внутренней области, как в других языках, таких как C ++? Например:

const debug = require('debug')('mymodule');

function example() {
    // Temporarily replace main `debug` variable with value that
    // only persists for this function
    const debug = debug.extend('myfunction');

    debug('should be in mymodule.myfunction');
}

debug('should be in mymodule');

Когда я пытаюсь это сделать, Node жалуется, что я получаю доступ к внутреннему debug до того, как я его определил, когда я действительно хочу получить доступ к debug из родительская область.

Ответы [ 2 ]

1 голос
/ 19 января 2020

Вы можете переопределить более высокую область с локальным определением. Но при этом вы больше не можете получить доступ к более высокому уровню.

Когда вы делаете это:

const debug = debug.extend('myfunction');

Вы не можете получить доступ к debug.extend(), поскольку локальный debug уже определен, но еще не инициализирован.

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

const debug = require('debug')('mymodule');

function example() {
    // in a scope higher than where we define new debug variable,
    // save a copy of it so we can still access it
    const oldDebug = debug;

    // create another block scope to contain the new debug definition
    // and not interfere with saving the previous one above
    {
        const debug = oldDebug.extend('myfunction');

        debug('should be in mymodule.myfunction');
     }
}

debug('should be in mymodule');

Другой класс c способ справиться с этим - передать аргумент debug в вашу функцию и присвоить параметру другое имя. Затем вы можете использовать как новые, так и старые значения.

const debug = require('debug')('mymodule');

function example(oldDebug) {
    const debug = oldDebug.extend('myfunction');
    debug('should be in mymodule.myfunction');
}
example(debug);

debug('should be in mymodule');
0 голосов
/ 19 января 2020

Могли бы быть и лучшие решения, но я заставил его работать так:

debug = 'foo';

function example() {
  const debug = this.debug + 'bar';
  console.log(debug); // prints 'foobar'
}

example();
console.log(debug); // prints 'foo'

или, если вы хотите сохранить ключевое слово const:

const debug = 'foo';

function example(debugRef) {
  const debug = debugRef + 'bar';
  console.log(debug); // prints 'foobar'
}

example(debug);
console.log(debug); // prints 'foo'
...