旧样式的JavaScript
var
在闭合外的声明是全局(顶级范围),可以从window
对象中访问浏览器。 例如,声明var x = 3;
可以使用window['x']
.可以访问。
您如何同样访问声明的名称(字符串)?
const
在上面的示例中,如何获得“ y”和“ z”的值
let
和var x = 3;
const y = 7;
let z = 21;
console.log('x = ' + window['x']); //x = 3
console.log('y = ' + window['y']); //y = undefined
console.log('z = ' + window['z']); //z = undefined
?
用代码fiddle:
https://jsfiddle.net/g78ah6we/dedits(为了清楚添加注释):
1。虽然不是典型的,但有一些用例,例如在
library内部,必须仅根据声明的名称访问声明。
2。仅需要读取访问(任何声明都不会修改)。
3。提到7
21
对象(或undefined
对象)。
通过间接电话window
window
来完成全局global
和eval
const
您还可以通过构建脚本来执行设置操作来设置全局
let
eval
您不能做的就是使用间接调用来添加
eval
或
eval
变量到全局范围:它们是块级别的声明,代码let
评估被视为块 - 因此声明被丢弃了当(间接致电)
"use strict";
let myVar = "global variable myVar";
console.log( myVar);
(function myLibrary() {
const myVar = "local variable myVar";
const indirectEval = eval;
var varName = "myVar";
console.log( eval(varName)); // direct call uses local scope
console.log( indirectEval(varName)); // indirect call uses global scope
var result = "\"updated global variable even though shadowed\"";
var js = varName + '=' + result;
indirectEval(js);
// but trying to define a new let variable doesn't attach to global scope
var js2 ='let letVar2 = "let variable two"';
indirectEval( js2);
})();
console.log( myVar)
console.log( "letVar2: " + typeof letVar2);
let
const
Indirect vs直接呼叫eval
直接呼叫
eval
仅获得尚未在呼叫函数范围中遮蔽的全局变量的值。这可能会限制可变名称的选择,或者可以在库中从呼叫中进行调用。
间接呼叫在全局范围内执行,并且可以获取全局变量的值,而不论库中的名称阴影如何。从源文本中创建一个新的
(0,eval)("identifierString");
siss
var x = 3;
const y = 7;
let z = 21;
{
const y = "shadow"
let z = 42;
console.log('x = ' + (0,eval)('x')); //x = 3
console.log('y = ' + (0,eval)('y')); //y = 7
console.log('z = ' + (0,eval)('z')); //z = 21
}
eval
eval
或
Function
不那么容易
)或至少在尝试中访问/在初始化之前使用未确定标识符或使用名称声明的陷阱捕获块。 我建议您找到一般使用全局变量名称字符串的替代方案。在库(例如
eval
)上提供一个静态名称空间对象,并处理为对象的属性名称或在库呼叫中包含选项对象参数的处理字符串值。
我已经将其标记的traktor53
标记为接受和投票,因为它包含解决方案的技术核心。
对于任何人来说都是有帮助的,这是包裹在防止声明中执行代码的函数中的解决方案。
var
注:
意识到,匹配JavaScript标识符的the Regex非常简单(它没有处理所有有效的字符并在保留的单词上旅行...正如Traktor53所指出的那样,“这比您认为的要复杂得多。 ) Change Change
let
to或任何适合您需求的东西(为了简单起见,我使用了数字的示例,但是我的真实用例实际上是在寻找对象)。用代码fiddle: https://jsfiddle.net/pilafmon/g0s753u4
the the the the the the the the。 在对比中,没有关键字的变量声明在最外层的功能范围气泡中创建变量。在浏览器中,最外面的功能范围由
class
对象无法控制的是最外面的块范围。
如果您的代码无法访问
myLibrary.data
模式的变量,那么您的代码无法正常工作,那么其中肯定有一个设计问题。