js中大括號有四種語義作用
語義1,組織復合語句,這是最常見的
js**:
if( condition )else
for()
語義2,物件直接量宣告
varobj = ;
整個是個賦值語句,其中的是個表示式,單獨存在也不會出現語法錯誤的。
語義3,宣告函式或函式直接量
js**
functionf1()
varf2 =function()
f1與f2的區別是前者在語法解釋期,後者在執行期。區別在於:如果呼叫該函式的**在函式定義之後,則沒有區別;如果呼叫該函式的**在函式定義之前,則f1仍然可以呼叫,f2則會報錯,提示f2未定義。
語義4,結構化異常處理的語法符號
js**
trycatch( ex )finally
這裡的大括號與符合語句(語義1)是有區別的,大括號中如果只有一條語句,在if/else/for等中大括號是可以省略的,但try/catch/finally則不能省略。
以下**牛逼,學習了
js**
function(){}() //匿名函式立即執行, 語法分析期報錯
{}.constructor //獲取物件直接量的構造器,語法分析期報錯
令人不解的是為何.constructor這麼寫卻不報錯呢,乙個是想獲取物件直接量的構造器,乙個是獲取陣列直接量的構造器而已。
當然新增個變數接收也不會報錯
var c = {}.constructor;
同樣的情況如
var fn = function(){}(),也不會報錯。
實際上是js的「語句優先」在作怪,即{}被理解成復合語句塊(語義1)而不是物件直接量(語義2)或宣告函式(語義3)的語義。
function(){}(),大括號被理解成復合語句,自然前面的function()宣告函式的語法不完整導致語法分析期出錯。
{}.constructor,大括號被理解成復合語句,大括號後面是點運算子,點運算子前沒有合理的物件自然也報錯。
修復方式眾所周知:加個強制運算子()
(function(){})(),(function(){});//強制其理解為函式(語義3),「函式()」表示執行該函式,即宣告後立即執行了。
({}).constructor //({})強制把大括號理解成物件直接量(語義2),「物件.xx」表示獲取物件的成員,自然後面的點運算子可以正常執行了。
js 中 , 中括號,大括號使用詳解
一 大括號,表示定義乙個物件,大部分情況下要有成對的屬性和值,或是函式。如 var langshen 上面宣告了乙個名為 langshen 的物件,多個屬性或函式用,逗號 隔開,因為是物件的屬性,所以訪問時,應該用.點 來層層訪問 langshen.name langshen.age,當然我們也可以...
JS中的大括號 和中括號 詳解
一 大括號,表示定義乙個物件,大部分情況下要有成對的屬性和值,或是函式。如 var langshen 上面宣告了乙個名為 langshen 的物件,屬性名和值用 冒號 隔開,多個屬性或函式用,逗號 隔開,因為是物件的屬性,所以訪問時,應該用.點 來層層訪問 langshen.name langshe...
bash shell 大括號擴充套件
周海漢 文 2010.6.10 大括號 花括號 擴充套件方式也有意思。zhouhh zhh64 brace ls bkzhouhh zhh64 brace touch file.txt zhouhh zhh64 brace ls bk fileinfo.txt filereadme.txt file...