首页 > 解决方案 > 有没有办法以类似于将变量添加到窗口对象的方式将变量添加到范围?

问题描述

只是出于好奇:

在 Web 浏览器的上下文中,可以将属性添加到窗口对象,从而使其成为全局对象,例如:

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。逐个属性地进行操作会有点麻烦,但如果有这样的“范围”对象,它可以自动完成。

我知道您可以通过多种方式解决问题,也许这样做并没有那么大的好处。这个问题只是出于好奇。

对这篇文章的更改:添加了对函数 'a()' 的调用,正如 kylestephens 所指出的那样。

标签: javascriptscope

解决方案


这就是作用域的工作原理——你不需要做任何特别的事情,只需定义一个变量。定义的变量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)
  


推荐阅读