我知道这个问题听起来很模糊,所以我会用一个例子说清楚:
$var = 'bar';
$bar = new {$var}Class('var for __construct()'); //$bar = new barClass('var for __construct()');
Run Code Online (Sandbox Code Playgroud)
这就是我想要做的.你会怎么做?我当然可以使用这样的eval():
$var = 'bar';
eval('$bar = new '.$var.'Class(\'var for __construct()\');');
Run Code Online (Sandbox Code Playgroud)
但我宁愿远离eval().没有eval()有没有办法做到这一点?
是否可以将模板字符串创建为通常的字符串
let a="b:${b}";
Run Code Online (Sandbox Code Playgroud)
然后将其转换为模板字符串
let b=10;
console.log(a.template());//b:10
Run Code Online (Sandbox Code Playgroud)
没有eval,new Function以及动态代码生成的其他方法?
我正在使用以下课程轻松存储我的歌曲数据.
class Song:
"""The class to store the details of each song"""
attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location')
def __init__(self):
for att in self.attsToStore:
exec 'self.%s=None'%(att.lower()) in locals()
def setDetail(self, key, val):
if key in self.attsToStore:
exec 'self.%s=val'%(key.lower()) in locals()
Run Code Online (Sandbox Code Playgroud)
我觉得这比写出一个if/else块更具可扩展性.但是,eval似乎被认为是一种不良做法并且使用起来不安全.如果是这样,任何人都可以向我解释为什么并告诉我一个更好的方法来定义上面的类?
我有一个脚本,使用一些内容将一些内容插入元素innerHTML.
例如,内容可以是:
<script type="text/javascript">alert('test');</script>
<strong>test</strong>
Run Code Online (Sandbox Code Playgroud)
问题是<script>标签内的代码没有被执行.我用Google搜索了一下,但没有明显的解决方案.如果我使用jQuery插入内容$(element).append(content);,脚本部分eval会在注入DOM之前得到.
有没有人有一段执行所有<script>元素的代码?jQuery代码有点复杂,所以我无法弄清楚它是如何完成的.
编辑:
通过窥视jQuery代码,我已经设法弄清楚jQuery是如何做到的,这导致了以下代码:
Demo:
<div id="element"></div>
<script type="text/javascript">
function insertAndExecute(id, text)
{
domelement = document.getElementById(id);
domelement.innerHTML = text;
var scripts = [];
ret = domelement.childNodes;
for ( var i = 0; ret[i]; i++ ) {
if ( scripts && nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
}
}
for(script …Run Code Online (Sandbox Code Playgroud) 我一次又一次地看到Bash在Stack Overflow上使用eval的答案,并且答案得到了抨击,双关语是为了使用这种"邪恶"结构.为什么eval这么邪恶?
如果eval不能安全使用,我应该使用什么呢?
这两个功能在幕后做同样的事情吗?(在单一陈述函数中)
var evaluate = function(string) {
return eval('(' + string + ')');
}
var func = function(string) {
return (new Function( 'return (' + string + ')' )());
}
console.log(evaluate('2 + 1'));
console.log(func('2 + 1'));
Run Code Online (Sandbox Code Playgroud) 我正在使用这个:
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Run Code Online (Sandbox Code Playgroud)
我有一个如下脚本:
#!/bin/bash
e=2
function test1() {
e=4
echo "hello"
}
test1
echo "$e"
Run Code Online (Sandbox Code Playgroud)
哪个回报:
hello
4
Run Code Online (Sandbox Code Playgroud)
但是如果我将函数的结果赋给变量,e则不修改全局变量:
#!/bin/bash
e=2
function test1() {
e=4
echo "hello"
}
ret=$(test1)
echo "$ret"
echo "$e"
Run Code Online (Sandbox Code Playgroud)
返回:
hello
2
Run Code Online (Sandbox Code Playgroud)
我听说过在这种情况下使用eval,所以我这样做test1:
eval 'e=4'
Run Code Online (Sandbox Code Playgroud)
但结果相同.
你能解释一下为什么不修改它吗?我怎么能保存test1函数的回声ret并修改全局变量呢?
在我用PHP开发的这些年里,我总是听说使用eval()是邪恶的.
考虑以下代码,使用第二个(更优雅)选项是否有意义?如果没有,为什么?
// $type is the result of an SQL statement
// e.g. SHOW COLUMNS FROM a_table LIKE 'a_column';
// hence you can be pretty sure about the consistency
// of your string
$type = "enum('a','b','c')";
// possibility one
$type_1 = preg_replace('#^enum\s*\(\s*\'|\'\s*\)\s*$#', '', $type);
$result = preg_split('#\'\s*,\s*\'#', $type_1);
// possibility two
eval('$result = '.preg_replace('#^enum#','array', $type).';');
Run Code Online (Sandbox Code Playgroud) 我开始阅读JavaScript模式,一些代码让我困惑.
var global = (function () {
return this || (1, eval)('this');
}());
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
Q1:
(1, eval) === eval?
为什么以及如何运作?
Q2:为什么不呢
var global = (function () {
return this || eval('this');
}());
Run Code Online (Sandbox Code Playgroud)
要么
var global = (function () {
return this;
}());
Run Code Online (Sandbox Code Playgroud) 关于如何避免使用有几个问题 eval(parse(...))
这引发了一些问题:
eval(parse())避免? get()?)