Конвертировать частные переменные в публичные переменные - PullRequest
0 голосов
/ 25 января 2019

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

function test() {
    let private1 = 1, private2 = 2;

    return private1;
}

test(); // returns the first variable value, but not if I have multiple variables
console.log(private1); // returns obvious error - how to make private variable global?

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

Мне никогда не приходилось использовать переменные таким образом, и я не мог найти другие посты, объясняющие это, так что это вообще плохая практика? Мне интересно знать. Спасибо. Любое объяснение или руководство о том, как лучше всего обращаться с переменными, было бы очень полезно.

Ответы [ 8 ]

0 голосов
/ 25 января 2019

Только не добавляйте никаких объявлений в Begining.Javascript рассматривайте это как глобальную переменную.

function test(){
   private1 = 1;
   private2 = 2
}

test();

После вызова функции test private1 and private2 устанавливается как глобальная переменная.

Если вы поставите консоль ниже теста, как это

console.log(private1,private2);
//1 2 is the answer.

Он будет напечатан в консоли, и вы можете также назвать его так.

window.private1;
window.private2;

Вот и все.

0 голосов
/ 25 января 2019

Почему сначала частный, а потом публичный? Если вам нужно какое-то личное пространство, вы можете взять IIFE и присвоение результирующего объекта глобальным переменным.

var { private1: global1, private2: global2 } = function () {
        let private1 = 'foo',
            private2 = 'bar';
            
        return { private1, private2 };
    }();

console.log(global1, global2);
0 голосов
/ 25 января 2019

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

1.Убедитесь, что strict mode не активирован, и «забудьте» объявить переменные

// Dont do "use strict";
function test() {
    private1 = 1;
    private2 = 2;
    return private1;
}

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

2.Добавьте переменные непосредственно к глобальному объекту

function test() {
    window.private1 = 1;
    this.private2 = 2;
    return private1;
}

Объект окна можно получить с помощью window или this.Но this вернет window, только если он не вызывается из object или связанной / примененной функции.

Возврат и уничтожение (ES6)

Хорошая функцияES6 (то есть это нельзя использовать в старых браузерах, таких как IE) - это деструктурирование, которое позволяет вам сделать это:

function test() {
    return { private1: 1, private2: 2 };
}
var { private1: private1, private2: private2 } = test();

или

function test() {
    return [1, 2];
}
var { 0: private1, 1: private2 } = test();
0 голосов
/ 25 января 2019

область действия let фиксирована, вы не можете получить к ней доступ вне функции. По решению вашей проблемы привязка переменной к окну.

function test() {
    private1 = 1; // or you can use window.private1 = 1
    private2 = 2;
    return private1;
}


test(); 
console.log(private1);

Если вы не объявляете свою переменную с помощью var let or const, она автоматически привязывается к области видимости окна, но это не считается хорошей практикой. Вы также можете использовать window.variableName для этой цели.

0 голосов
/ 25 января 2019

Если вы используете браузер, вы можете назначить их на window.

function test() {
  window.private1 = 1, window.private2 = 2;
}

test()

console.log(private1, private2)

Или вы можете экспортировать их, вернув:

function test() {
    let private1 = 1, private2 = 2;

    return {
      private1,
      private2
    };
}

console.log(test())

Так это вообще плохая практика?

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

0 голосов
/ 25 января 2019

Самый простой способ сделать private1 глобальным - сделать что-то вроде этого

let global1

function test() {
    let private1 = 1, private2 = 2;

    return private1;
}

global1 = test()

Но, как говорит другой ответ, если вы хотите этого, было бы лучше объявить переменную вне функцииОбъем.

0 голосов
/ 25 января 2019

Вы можете создать глобальные переменные и присвоить им значение

let global1,global2;
function test() {
    let private1 = 1, private2 = 2;
    global1 = private1;
    global2 = private2;

    return private1;
}

test(); 
console.log(global1); 

или вы можете использовать возвращаемое значение

function test() {
    let private1 = 1, private2 = 2;

    return private1;
}

var result = test(); 
console.log(result);
0 голосов
/ 25 января 2019

Переменная, объявленная внутри функции, доступна только внутри этой функции, если вы не объявили ее вне функции.

В этом примере вы не можете использовать private1 вне функции.

function test() {
  let private1 = 1;
  return private1;
}
test();
console.log(private1);

В противном случае вы не можете сделать его глобальным вне области действия указанной функции.

В этом примере вы можете использовать private1 вне функции.

let private1;

function test() {
  private1 = 1;
  return private1;
}
test();
console.log(private1);
...