为什么这个js代码有效?

时间:2009-12-11 02:24:18

标签: javascript

if (!wysiwyg_toolbarButtons) {
    var wysiwyg_toolbarButtons = new Array(
        //command, display name, value, title, prompt/function, default text
        ["bold", "Strong", WYSIWYG_VALUE_NONE, "Give text strength"],
        ["italic", "Emphasis", WYSIWYG_VALUE_NONE, "Give text emphasis"],
        ["createlink", "Link", WYSIWYG_VALUE_PROMPT, "Create a hyperlink", "Enter the URL:", "http://"],
        ["unlink", "Unlink", WYSIWYG_VALUE_NONE, "Remove hyperlink"],
        ["insertimage", "Image", WYSIWYG_VALUE_PROMPT, "Insert an image", "Enter the URL of the image:", "http://"],
        ["inserthorizontalrule", "Rule", WYSIWYG_VALUE_NONE, "Insert horizontal rule"],
        ["div"], // place a toolbar divider
        ["formatblock", "Headling 1", "<H1>", "Make top level heading"],
        ["formatblock", "Headling 2", "<H2>", "Make 2nd level heading"],
        ["formatblock", "Headling 3", "<H3>", "Make 3rd level heading"],
        ["formatblock", "Paragraph", "<P>", "Make a paragraph"],
        ["formatblock", "Monospace", "<PRE>", "Make paragraph monospaced text"],
        ["insertunorderedlist", "List", null, "Make an unordered list"],
        ["insertorderedlist", "Ordered List", null, "Make an ordered list"],
        ["div"], // place a toolbar divider
        ["toggleview", "Source", "Compose", "Switch views"]
    );
}

来自this file,带有演示here

我的问题是:为什么不报告“ReferenceError:wysiwyg_toolbarButtons未定义”?

5 个答案:

答案 0 :(得分:5)

网络浏览器中的JavaScript搜索窗口对象中的属性。访问未知属性不会引发错误,因此实际上它的评估方式如下:

if( !window.wysiwyg_toolbarButtons ) { }

在Firebug控制台中尝试if( !wtf ) { alert('error'); }if( !window.wtf ) { alert('no error'); }

修改

目前,firebug中的控制台使用with( window ) { ..console..code.. }来破坏代码。但是“with”语句很棘手,例如:

>>> alert(location);
= eval( "with( window ) { alert(location); }" );
OK, "location" attribute found in window

>>> alert(wtf);
= eval( "with( window ) { alert(wtf); }" );
ERROR, "wtf" not found in window, and not in global scope, throws ReferenceError

浏览器中的隐式窗口对象的行为与“with”语句使用的行为不同。

答案 1 :(得分:2)

代码所做的第一件事是对wysiwyg_toolbarButtons的真实性评估,因为它评估为falseundefined,然后块进入并定义变量。

答案 2 :(得分:1)

该代码正在做的是检查wysiwyg_toolbarButtons是否已定义,如果未定义,则定义并初始化它。

答案 3 :(得分:-1)

Javascript不是块作用域,因此if中的var声明与if之前发生的一样。

答案 4 :(得分:-2)

编辑:是的,我误解了我在说什么。对不起,答案很糟糕。

根据您的代码,wysiwyg_toolbarButtons语句在本地创建ifvar声明告诉JavaScript这是一个新变量,if语句范围内的任何内容都将使用这个新变量。

我假设这段代码与这样的语句一起运行。是否在该范围之外成功更改wysiwyg_toolbarButtons(或wysiwyg_elementMap,因为我扫描JS文件)并不重要。保持这样的声明是不好的编码实践,因为它不会像其他语言那样工作。

否则,我不会重述Quintin,Andreas和Dimitar已经说过的话。