javascript - 有没有办法以类似于将变量添加到窗口对象的方式将变量添加到范围?
问题描述
只是出于好奇:
在 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 所指出的那样。
解决方案
这就是作用域的工作原理——你不需要做任何特别的事情,只需定义一个变量。定义的变量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)
推荐阅读
- deployment - 如何将 2 个应用程序(同一个耳朵)部署到不同端口上的单个 jboss。甚至可能吗?
- node.js - NodeJs & Socket.IO 回合制多人游戏,关于配对玩家的问题
- openedge - 如何计算进行中/开放边缘 4 周期间的每周平均销售额?
- sql - oracle中REGEXP_LIKE的反义词是什么
- javascript - Vue v-for 在新文本区域上自动对焦
- javascript - 如何在 ReactJS 组件对象数组中插入元素(在现有元素之间)
- c++ - Qt Drop 事件未触发
- python - matplotlib:轴边框和刻度线/标签位置
- neural-network - About RNN with variable length vectors
- spring-kafka - spring-kafka 监听器关闭