为什么当我从Ajax调用中eval()responseText时会出现“undefined”这个词?

时间:2017-10-11 20:55:38

标签: javascript ajax eval

我有一个简单的测试如下所示。它工作正常,但由于某种原因,“未定义”一词出现在弹出窗口中。没有什么能让我理解什么是未定义的。有没有人经历过这个?

HTML

<html><head>
<style>#popup{border:1px solid black;background:#eadcce;padding:10px;margin:35px;display:none;}</style>
<script>
function popup(){
    var z;
    if(window.XMLHttpRequest){z=new XMLHttpRequest();}else{z=new ActiveXObject("Microsoft.XMLHTTP");}
    z.onreadystatechange=function(){if(z.readyState==4&&z.status==200){
            if(z.responseText != ''){
                    document.getElementById('popup').innerHTML=eval(z.responseText);
                    document.getElementById('popup').style.display="block";
            }
    }}
    z.open("POST",'/test2.php');z.send();
}
</script></head><body>
Push the button to open the popup: <button onclick="parent.popup();">Open Popup</button>
<div id="popup"></div>
</body></html>

test2.php

console.log("test");

除了“未定义”这个词出现在我的弹出窗口中之外,一切都很有效。有谁知道为什么?我正在使用Firefox 55.0.3。

1 个答案:

答案 0 :(得分:2)

eval评估JavaScript代码并返回评估的最后一个语句的结果。函数console.log返回undefined,因此eval('console.log("test")') also returns未定义(after printing the string测试`到浏览器的日志中。)

如果您不希望自己的对话框包含undefined,请不要让评估的JavaScript字符串中的最后一个字符串调用返回undefined的函数。例如,字符串

console.log("test"); "foobar";
当使用foobar进行评估时,

将返回字符串eval,因为它是最后一个语句的值。

同样,字符串

console.log("test"); ['a', 'b'].indexOf('a');
评估后,

将返回0,因为它是最终声明中indexOf调用的返回值。