我想使用global object获得一个常数变量以动态使用它,但是global.myconstant
不起作用,但是global.myvar
起作用。
λ node
> const myconstant = true
undefined
> global.myconstant
undefined
> var myvar = true
undefined
> global.myvar
true
> global.const
undefined
我想做的事:
const myconstant = () => { console.log("ok const"); };
var myvariable = () => { console.log("ok var"); };
const watchlist = {
myconstant: "file1.html",
myvariable: "file2.html"
};
Object.keys(watchlist).forEach((taskName) => {
try {
global[taskName](); //doesn't work with const
} catch (e) {
console.error("error", taskName);
}
});
实际输出:
error myconstant
ok var
想要的输出:
ok const
ok var
实时演示:https://repl.it/repls/SunnyScholarlyPasswords
如何获取带有字符串的const变量? 不将const
替换为var
。
答案 0 :(得分:3)
仅将用pip3
声明的变量隐式分配给全局对象。如果要创建不可重新分配的属性,则应改用var
。例如,在浏览器中,引用Object.defineProperty
而不是window
:
global
Object.defineProperty(
window,
'myconstant',
{
value: () => { console.log("ok const"); },
configurable: false
}
);
var myvariable = () => { console.log("ok var"); };
const watchlist = {
myconstant: "file1.html",
myvariable: "file2.html"
};
Object.keys(watchlist).forEach((taskName) => {
try {
window[taskName]();
} catch (e) {
console.error("error", taskName);
}
});
// Won't reassign, and will throw an error in strict mode:
window.myconstant = 'foo';
console.log(typeof window.myconstant);
是密钥,尽管它是可选的-无论如何它默认为configurable: false
。不可修改的属性无法修改或删除。
答案 1 :(得分:0)
描述的行为是节点REPL的自然行为,但不是节点REPL的自然行为,而模块中评估的代码则是自然行为。模块范围内的变量不会泄漏到全局变量,因为它们是在module scope中定义的,这对var
和const
都适用。这将在Node模块中发生:
const myconstant = 1;
var myvariable = 2;
console.log(global.myconstant) // undefined
console.log(global.myvariable) // undefined
在REPL中发生这种情况的原因是,代码是在全局范围内评估的。可以使用间接eval
在模块范围内复制所描述的行为:
(0, eval)(`
const myconstant = 1;
var myvariable = 2;
`);
console.log(global.myconstant) // undefined
console.log(global.myvariable) // 2
这是var
与块作用域变量(const
等)之间的区别。在全局范围内定义时,var
导致在全局变量(Node中的global
)上定义属性,而const
则没有。
如果要定义全局,则应将其定义为属性:
global.myconstant = 1;
global.myvariable = 2;
如果需要定义不会被重新分配的全局变量,则应使用描述符(作为另一个答案已经说明):
Object.defineProperty(global, 'myconstant', {
value: 1,
configurable: false,
writable: false
});
通常不建议将全局变量用于本地目的,尤其是在诸如Node之类的模块化环境中。