为什么我收到这个jsfiddle错误,document.write可以是eval的一种形式

时间:2013-02-24 03:01:24

标签: javascript jsfiddle

我正在测试我在阅读书籍时找到的代码。我在JS小提琴中测试时遇到此错误,document.write可以是eval的一种形式。

     var text = '<html><body bgcolor=linen><p>' +
    'This is <b>bold<\/b>!<\/p><\/body><\/html>';

var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g;
var a, i;
while ((a = tags.exec(text))) {
    for (i = 0; i < a.length; i += 1) {
        document.writeln(('// [' + i + '] ' + a[i]).entityify());
    }
    document.writeln();
}   

我在document.writeln()的两行上都收到了上面的JSfiddle警告。

1 个答案:

答案 0 :(得分:16)

请注意,这只是一个警告 - 但应该是一个值得尊重的好警告。它实际上是由一个名为JSLint的检查器生成的 - http://www.jameswiseman.com/blog/2011/03/31/jslint-messages-document-write-can-be-a-form-of-eval/提供了有关此警告推理的良好读数。

基本上,这个基础是“eval is evil” - 并且document.write可用于执行评估。

除此之外 - 在上面没有提到,尽可能避免使用document.write,除非是简单的测试。它在被认为是“完整”之后写入DOM,此时只能使用支持的DOM方法进行修改。有关此问题的其他详细信息,请参阅Why is document.write considered a "bad practice"? - 其中提到“更好地使用安全和DOM友好DOM manipulation methods”(document.createElementelement.appendChild等)。 https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Using_the_W3C_DOM_Level_1_Core可以找到一个很好的具体例子。