窗口[名称]等同于动态访问const,并让声明

问题描述 投票:0回答:2

旧样式的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
javascript browser constants variable-declaration window-object
2个回答
5
投票
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);
返回时。
P。这是一个技术答案。是的,我听说过“评估是邪恶的”,一三遍。

对于仅使用硬编码变量名称字符串(为了防止代码插入)的读取访问,您可以使用该模式:

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。 

在对比中,没有关键字的变量声明在最外层的功能范围气泡中创建变量。在浏览器中,最外面的功能范围由

1
投票
对象控制。

class对象无法控制的是最外面的块范围。

如果您的代码无法访问

myLibrary.data
模式的变量,那么您的代码无法正常工作,那么其中肯定有一个设计问题。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.