一些一般的JavaScript问题

时间:2010-08-14 18:51:17

标签: javascript html

来自Flattr Javascript API description

<script type="text/javascript">
<!--//--><![CDATA[//><!--

    (function() {
        var s = document.createElement('script'), t = document.getElementsByTagName('script')[0];

        s.type = 'text/javascript';
        s.async = true;
        s.src = 'http://api.flattr.com/js/0.5.0/load.js';

        t.parentNode.insertBefore(s, t);
    })();

//--><!]]>
</script>

我对<!--//--><![CDATA[//><!--//--><!]]>有点好奇。我想有些黑客可以欺骗那些不了解<script> - 标签的老浏览器。但是<!--不够吗? CDATA的内容究竟是什么?如果我不关心旧的浏览器,那么这一切都已经过时了,对吧? (顺便说一句,有人知道任何浏览器,如果我不把这些东西放在那里会让人感到困惑吗?)

然后我想知道函数定义。为什么会这样?为什么不直接调用代码?是不是垃圾邮件全局命名空间?如果是这样的话,那么做到这一点的方法就不那么容易,也不那么简单,例如只需将代码放入{}

3 个答案:

答案 0 :(得分:5)

它们之间是黑客的组合:

  • 在HTML介绍脚本元素(十多年前)之前应对浏览器
  • 处理包含&amp;,&lt;的JavaScript和&gt;在XHTML中
  • 当XHTML被视为HTML而不是XHTML(即几乎总是)时,补偿XHTML解决方案
  • 阻止其他黑客互相干扰

坦率地说,你可以(并且应该)忘记那些不理解<script>的浏览器(注意,这与不支持JS不同,它意味着根本不能识别元素,所以对待它(有效) )作为<span>)。如果您这样做并使用XHTML,那么您可以使用前缀为JS注释(//)的CDATA标志。

您通常也应该避免使用XHTML。除非您正在处理一个坚持生成XHTML的服务器端系统,并且将其转换为HTML需要付出更多努力,然后处理编写HTML兼容XHTML的所有问题,那么XHTML几乎不值得花费。 / p>

如果您没有使用XHTML或关心甚至不会说HTTP 1.1的浏览器,那么您只需要脚本标签和脚本,而不需要任何包装器。

在这个特定示例中,您无论如何都不需要CDATA标志 - 该脚本不包含任何在XML中具有特殊含义的字符,因此您不需要将这些字符视为文本而不是标记的指令

答案 1 :(得分:2)

CDATA在今天的HTML5天内没用,(function() {...})()包装代码,使var声明属于该函数的本地。
全局变量可能导致不需要的与页面上的其他代码交互。

答案 2 :(得分:1)

netscape 1需要注释内容,因为在netscape 2中引入了脚本标记。所以是的......不再需要了;)

text="text/javascript"

也可能不需要IE3或4,但脚本标签的默认值始终是javascript。

JavaScript中不存在

{}块作用域,只有全局和函数作用域,因此需要在函数内包装代码并始终使用'var'声明来防止全局污染。

(function(){}());

不能再被称为黑客了,这是一种完美的合法技术,虽然可能有点害怕寻找外行。以下可能被认为更漂亮......

function init(){
    // code
}
init();

但是你要引入一个名为'init'的全局函数。此外,大多数经验丰富的JS程序员都熟悉并认识到自称匿名函数模式,这里有一个更有用的。

(function(global, doc, undefined){
    //code
}(this, document));

'global'变量现在是对窗口对象的引用,'doc'变量现在是对文档的简写引用,undefined是未定义的。为什么'未定义'的参数?因为有些nitwit可能会为全局'undefined'变量分配一个值......可能是多余的,但是在编写libs / frameworks / toolkits时,要记住这一点;)