js中大括號有四種語義作用
語義1,組織復合語句,這是最常見的
**如下:
if( condition ) else
for()
語義2,物件直接量宣告
**如下:
var obj = ;
整個是個賦值語句,其中的是個表示式。
語義3,宣告函式或函式直接量
**如下:
function f1()
var f2 = function()
f1與非f2的區別是前者在語法解釋期,後者在執行期。區別在於:如果呼叫該函式的**在函式定義之後,則沒有區別;如果呼叫該函式的**在函式定義之前,則f1仍然可以呼叫,f2則會報錯,提示f2未定義。
語義4,結構化異常處理的語法符號
**如下:
try catch( ex )finally
這裡的大括號與符合語句(語義1 )是有區別的,大括號中如果只有一條語句,在if/else/for等中大括號是可以省略的,但try/catch/finally則不能省略。
以下**糾結了偶n久
**如下:
function(){}() //匿名函式立即執行, 語法分析期報
{}.constructor //獲取物件直接量的構造器,語法分析期報錯
令人不解的是為何.constructor這麼寫卻不報錯呢,乙個是想獲取物件直接量的構造器,乙個是獲取陣列直接量的構造器而已。
當然新增個變數接收也不會報錯
var c = {}.constructor;
同樣的情況如
var fn = function(){}(),也不會報錯。
實際上是js的「語句優先」在作怪,即{}被理解成復合語句塊(語義1 )而不是物件直接量(語義2 )或宣告函式(語義3 )的語義。
function(){}(),大括號被理解成復合語句,自然前面的function()宣告函式的語法不完整導致語法分析期出錯。
{}.constructor,大括號被理解成復合語句,大括號後面是點運算子,點運算子前沒有合理的物件自然也報錯。
修復方式眾所周知:加個強制運算子()
(function(){})(),(function(){});//強制其理解為函式(語義3 ),「函式()」表示執行該函式,即宣告後立即執行了。
({}).constructor //({})強制把大括號理解成物件直接量(語義2 ),「物件.xx」表示獲取物件的成員,自然後面的點運算子可以正常執行了。
JavaScript函式解析1
為常見的方式,用關鍵字function來宣告建立 function functionname 引數1,引數2 洩漏zhi,引數n 宣告式的函式只在頁面載入時解析一次,這種方式容易在 中定位,方便查詢閱讀和理解,一一般沒有記憶體洩漏之類的負面影響。function helloworld toyou h...
JavaScript解析XML檔案
今天get了乙個新技能,用js來解析xml檔案,xml格式的資料很普遍,在ajax裡有個respon ml就返回的是xml格式的資料,下面是js如何解析xml檔案,獲得裡面的資料。一.建立xmldocument物件 宣告xml物件 var xml xml.createdocument functio...
javascript解析xml檔案
info.xml檔案中的 script.js中的 function xml 第一種輸出方式 var m dom.getelementsbytagname info name 0 childnodes 獲得name下的根節點 alert m.length 輸出其陣列的大小 alert m 0 geta...