[英]some general JavaScript questions
<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>
-tag的舊瀏覽器的技巧。 但是<!--
不夠嗎? CDATA
到底是關於什么的? 而且,如果我不關心舊的瀏覽器,那么所有這些都已經過時了,對嗎? (順便說一句,沒有人知道在所有的任何瀏覽器,如果我不會把這個東西還有誰也感到困惑?)
然后我想知道函數定義。 為什么在那兒? 為什么不直接調用代碼? 是否不向全局名稱空間發送垃圾郵件? 如果是這樣,難道沒有比這更簡單,更簡單的方法了,例如,僅將代碼放入{}
?
黑客之間的結合是:
坦白說,您可以(並且應該)忘記不理解<script>
瀏覽器(請注意,這與不支持JS並不相同,這意味着根本無法識別該元素,因此(有效)將其視為<span>
)。 如果這樣做並使用XHTML,則可以僅使用以JS注釋( //
)為前綴的CDATA標志。
通常,您還應該避免使用XHTML。 除非您要處理一個堅持要生成XHTML的服務器端系統,並且要把它轉換成HTML還要付出更多的努力,否則要處理編寫與HTML兼容的XHTML的所有問題,那么XHTML幾乎是不值得的。
如果您不使用XHTML或不關心甚至不講HTTP 1.1的瀏覽器,那么您只需要script標簽和腳本,根本不需要任何包裝。
在這個特定示例中,無論如何您都不需要CDATA標志-該腳本不包含任何在XML中具有特殊含義的字符,因此您不需要一條將這些字符視為文本而不是標記的指令。
在當今的HTML5時代, CDATA
毫無用處,並且(function() {...})()
包裝了代碼以使var
聲明在該函數中本地化。
全局變量可能會導致與頁面上的另一個代碼發生不必要的交互。
對於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”變量現在是對document的簡寫引用,而undefined是undefined。 為什么使用“未定義”參數? 因為可能有一些nitwit為全局“未定義”變量分配了一個值...可能是多余的,但是在編寫libs / frameworks / toolkits時,要記住這一點;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.