亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JS語(yǔ)句為什么不能以“function”與大括號(hào)開(kāi)頭

ermaoL / 1263人閱讀

摘要:語(yǔ)句之間使用作為結(jié)尾,其中主要包括表達(dá)式語(yǔ)句塊語(yǔ)句空語(yǔ)句和聲明語(yǔ)句,這里不細(xì)講。對(duì)于這句話,只能說(shuō)對(duì)錯(cuò)一半吧先來(lái)說(shuō)一下為什么語(yǔ)句不能以開(kāi)始,這里涉及到函數(shù)聲明的概念。

前言

前段時(shí)間調(diào)試代碼,查看對(duì)象的toString的返回?cái)?shù)據(jù),由于比較簡(jiǎn)單,直接在瀏覽器的控制臺(tái)輸出代碼

{}.toString();    // Uncaught SyntaxError: Unexpected token .

“.”不是期待的表達(dá)式,{}在JS中不是一個(gè)再正常不過(guò)的對(duì)象么,于是試了一下其他對(duì)象類型數(shù)據(jù)。

[].toString();    // ""
function(){}.toString();    // Uncaught SyntaxError: Unexpected token (
/^.$/.toString();    // "/^.$/"

查資料看了一下,總的來(lái)說(shuō)涉及到JS這門語(yǔ)言設(shè)計(jì)的幾個(gè)概念:語(yǔ)句、函數(shù)聲明、語(yǔ)句塊等

語(yǔ)句
JS中,應(yīng)用程序是由許多語(yǔ)法正確的語(yǔ)句組成的,語(yǔ)句的作用就是告訴瀏覽器應(yīng)該怎樣執(zhí)行程序。語(yǔ)句之間使用“;”作為結(jié)尾,其中主要包括表達(dá)式語(yǔ)句、塊語(yǔ)句、空語(yǔ)句和聲明語(yǔ)句,這里不細(xì)講。

注意上面一段話中的語(yǔ)法正確一詞,在前言的demo代碼中,數(shù)組和正則表達(dá)式可以正常調(diào)用的,但是對(duì)象和方法類型調(diào)用卻是失敗的,網(wǎng)上大部分答案回答都比較淺顯:”JS中語(yǔ)句不能以function或者大括號(hào)作為開(kāi)始,會(huì)報(bào)錯(cuò)“。對(duì)于這句話,只能說(shuō)對(duì)錯(cuò)一半吧!

先來(lái)說(shuō)一下為什么語(yǔ)句不能以”function“開(kāi)始,這里涉及到函數(shù)聲明的概念。

函數(shù)聲明
函數(shù)聲明:定義一個(gè)具有指定參數(shù)的函數(shù),以function開(kāi)頭, 其中包括函數(shù)名,參數(shù)名,和函數(shù)語(yǔ)句塊

舉個(gè)栗子?:

function funcName(arg1, arg2) {
    // 語(yǔ)句塊
}

我們代碼中調(diào)用toString方法”function(){}.toString“,是以”function“開(kāi)頭的, JS中會(huì)將以”function“ 開(kāi)頭的語(yǔ)句認(rèn)定為函數(shù)聲明語(yǔ)句,那么代碼必須符合函數(shù)聲明語(yǔ)句規(guī)范,很明顯”function“后未包括函數(shù)名,這條函數(shù)聲明語(yǔ)句明顯不符合規(guī)范。

正確的做法:

// 以”(“開(kāi)頭的語(yǔ)句JS并不會(huì)將其視作函數(shù)聲明
(function(){}).toString();
// 匿名函數(shù)
(function(){})()
// 匿名函數(shù)裝B一點(diǎn)的寫(xiě)法
void function(){}()

非函數(shù)申明代碼不可以“function”作為語(yǔ)句開(kāi)頭,那大括號(hào)又是怎么回事呢。

語(yǔ)句塊
將零個(gè)或多個(gè)語(yǔ)句聯(lián)合在一起,形成一條復(fù)合語(yǔ)句,用大括號(hào)將其包括

有的文檔上叫“塊語(yǔ)句”,也有人的文檔上叫復(fù)合語(yǔ)句,舉個(gè)栗子?,我們可以這樣寫(xiě)代碼:

{
    console.info("輸出一個(gè)語(yǔ)句");
    console.info("不出錯(cuò),是不是很神奇");
};

也就是說(shuō)如果我們以大括號(hào)開(kāi)頭,瀏覽器會(huì)理解將其視作一個(gè)語(yǔ)句塊,語(yǔ)句塊中的代碼和外面的代碼并沒(méi)有本質(zhì)的區(qū)別,也是從上至下而執(zhí)行。再看個(gè)栗子?:

{};    // undefined
{a: "a"};    // "a";
{a: "a"}.a;    // Uncaught SyntaxError: Unexpected token .

第一行很好理解,沒(méi)有任何執(zhí)行語(yǔ)句,當(dāng)然輸出undefined
第二行代碼呢,輸出“a”,這里不要被“:”給蒙蔽了,這里的的冒號(hào)是一個(gè)標(biāo)識(shí)符,類似于C語(yǔ)言中的標(biāo)記符,不同的是JS中通過(guò)“break”與“continue”跳轉(zhuǎn)到標(biāo)記符,二C語(yǔ)言中是通過(guò)“goto”,關(guān)于標(biāo)記符
第三行代碼等同于:“a: "a"; .a;” 沒(méi)有通過(guò)對(duì)象主體獲取屬性“a”,所以報(bào)錯(cuò)。

綜上所述,“{}.toString();” 等同于: “; .toString();” 未通過(guò)對(duì)象主體調(diào)用“toString”方法,不符合JS中期待的表達(dá)式

說(shuō)了這么多,用語(yǔ)句塊有什么好處呢,我能想到的唯一好處只有“裝B??帷?..

總結(jié)在最后

JS語(yǔ)句為什么不能以“function”和大括號(hào)開(kāi)頭呢?

以function開(kāi)頭,但必須是一個(gè)函數(shù)聲明語(yǔ)句

以大括號(hào)開(kāi)頭,但該大括號(hào)不再被當(dāng)做一個(gè)對(duì)象處理,而是當(dāng)做一個(gè)語(yǔ)句塊處理

綜上兩條說(shuō)明,JS語(yǔ)句可以以function,也可以以大括號(hào)作為開(kāi)頭,前提是必須符合JS中的語(yǔ)法規(guī)范

參考資料

MDN 語(yǔ)句
MDN 語(yǔ)句塊
MDN 標(biāo)記符
MDN Unexpected token
expressions-vs-statements
MDN Expressions_and_Operators

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/90687.html

相關(guān)文章

  • 編寫(xiě)高質(zhì)量JavaScript代碼的基本技巧

    摘要:五不要增加內(nèi)置的原型增加內(nèi)置構(gòu)造函數(shù)如,和等的原型屬性是一個(gè)增強(qiáng)功能性的強(qiáng)大的方法,但這可能會(huì)嚴(yán)重影響可維護(hù)性,因?yàn)檫@種做法將使代碼變得更加不可預(yù)測(cè)。推薦使用后者,這樣根據(jù)名字就能明顯地區(qū)分出變量函數(shù)和基本常量等。 一、盡量少用全局變量 減少全局名字空間污染,最理想的情況是一個(gè)應(yīng)用程序僅有一個(gè)全局變量。 二、單一var模式 var a = 1, b = 2, sum =...

    Alex 評(píng)論0 收藏0
  • 我的前端編碼習(xí)慣 —— js

    摘要:文件中的代碼塊可用以下代碼塊包裹,以減少全局污染。命名規(guī)則原則盡量避免潛在命名沖突,避免過(guò)于精簡(jiǎn),應(yīng)見(jiàn)名知意。必須與共同使用的構(gòu)造函數(shù)名應(yīng)以大寫(xiě)字母開(kāi)頭。變量所有的變量必須在使用前進(jìn)行聲明。僅在函數(shù)和構(gòu)造器內(nèi)使,以明確的上下指向。 代碼格式規(guī)范 1.html中外部腳本引入盡量放在尾部。 2.一個(gè)html文件中只寫(xiě)一個(gè)代碼塊。 3.JS文件中的代碼塊可用以下代碼塊包裹,以減少全局污染。 ...

    LancerComet 評(píng)論0 收藏0
  • 前端代碼編寫(xiě)規(guī)范

    摘要:前端代碼規(guī)范代碼編寫(xiě)規(guī)范縮進(jìn)每一層級(jí)由個(gè)空格組成,避免使用制表符進(jìn)行縮進(jìn)。單目運(yùn)算符的操作數(shù)之間不應(yīng)該用空白隔開(kāi)語(yǔ)句中的表達(dá)式之間應(yīng)當(dāng)用空格隔開(kāi)代碼編寫(xiě)規(guī)范頭部文檔類型建議使用格式的。內(nèi)聯(lián)元素寫(xiě)在一行內(nèi),塊狀元素還有列表和表格要另起一行。 前端代碼規(guī)范 JavaScript代碼編寫(xiě)規(guī)范 縮進(jìn) 每一層級(jí)由4個(gè)空格組成,避免使用制表符(Tab)進(jìn)行縮進(jìn)。 行的長(zhǎng)度 每行長(zhǎng)度不應(yīng)該超過(guò)80個(gè)...

    liangdas 評(píng)論0 收藏0
  • JS學(xué)習(xí)系列 07 - 標(biāo)簽聲明(Label Statement)

    摘要:上面這段代碼,在中的執(zhí)行結(jié)果是什么呢大家思考分鐘好,分鐘已過(guò),大家有結(jié)果了嗎千萬(wàn)不要在瀏覽器的控制臺(tái)中去寫(xiě)這段代碼,雖然結(jié)果和你開(kāi)始想的結(jié)果一樣,但是,它是錯(cuò)誤的。這是在控制臺(tái)中執(zhí)行的結(jié)果這是在中的執(zhí)行結(jié)果可以看到兩個(gè)結(jié)果是不一樣的。 1. 引言 假設(shè)有這么一道題: for (var i = 0; i < 10; i++) { console.log(i); for (...

    ormsf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<