解析Javascript中大括號「 」的多義性

2021-06-19 12:26:21 字數 1217 閱讀 5506

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...