Есть ли способ добавить переменную в область, аналогично тому, как переменные добавляются в объект окна? - PullRequest
0 голосов
/ 13 ноября 2018

Просто из любопытства:

В контексте веб-браузера можно добавить свойство к объекту окна, что делает его глобальным, например:

function a(){
   window.b="c";
}
//edit
a();
console.log(b);

Мне было интересно, можно ли установить переменные аналогичным образом, но только в текущей области видимости, например:

function a(){
   scope.b="c";
   console.log(b);
}
//but "b" is not available here.

Возможный вариант использования

 var objectOne=new(function(){
    this.a="e";
    this.b="f";
    this.c="g";
 })();
 (function(){
    var importlist=["a","b"];
    var scopehere=scope;
    for(var importitm of importlist){
       scopehere[importitm]=objectOne[importitm];
    }
    console.log(a,b);
 })();

Таким образом, в этом случае было бы возможно «импортировать» многие переменные последовательно, чтобы они были доступны внутри объекта как переменные вместо использования «this» (например, когда вы экспортируете их в окно), но в этом случае они являются частными.

В частности, если вы используете загруженный html-скрипт и хотите, чтобы его свойства были доступны в области видимости. Примеры: paper.js, three.js. Переход свойства за свойством был бы немного громоздким, но это могло бы быть сделано автоматически, если бы существовал такой объект "scope".

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

Изменения в этом сообщении: добавлен вызов функции ´a () ´, как указано в kylestephens.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Теоретически вы можете. Однако в вашем первом примере функция a () никогда не вызывается, и, таким образом, свойство 'b' никогда не устанавливается в объекте окна.

Это должно выглядеть так:

function a(){
  window.b="c";
}
a();
console.log(b);

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

0 голосов
/ 13 ноября 2018

Так работает область видимости - вам не нужно делать ничего особенного, просто определите переменную. Переменные, определенные с помощью let, попадают в ограничивающий их блок. Те, у кого var доступны для функции:

function a(){
   let b = "c";
   console.log(b);
}
a()
// console.log(b) error -- b not in scope 

Если у вас есть объект с кучей данных, лучше оставить эти данные в какой-то структуре, а не в куче отдельных переменных. Таким образом, идея импорта набора имен в область не поддерживается в общих случаях. В особых случаях вы можете использовать деструктуризацию:

// with array
function scope(importedList){
  let [a, b, c] = importedList // a, b, & c are local
  console.log(a, b, c)
}

scope([1, 2, 3])

// with object
function objscope(importedObject){
  let {a, b, c} = importedObject // a, b, & c are local
  console.log(a,b,c)
}

const someObj = {
  a: "e",
  b: "f",
  c: "g"
  }

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