Rumah >hujung hadapan web >Soal Jawab bahagian hadapan >Apakah penggunaan kurungan kerinting dalam javascript
Penggunaan pendakap dalam JavaScript: 1. Digunakan untuk menyusun pernyataan majmuk 2. Digunakan untuk menentukan objek, yang dalam kebanyakan kes mesti mempunyai atribut dan nilai berpasangan; 4. Digunakan sebagai simbol sintaks untuk pengendalian pengecualian berstruktur.
Persekitaran pengendalian tutorial ini: sistem Windows 10, versi JavaScript 1.8.5, komputer Dell G3.
Pendakap "{}" dalam Javascript mempunyai empat fungsi semantik:
Semantik 1. Menyusun pernyataan majmuk, Ini adalah yang paling biasa:
if( condition ) { //... }else { //... } for() { //... }
Semantik 2, pengisytiharan literal objek:
var obj = { name : 'jack', age : 23 };
Keseluruhannya ialah pernyataan tugasan, di mana { nama :'jack',umur:23} ialah ungkapan.
Semantik 3, mengisytiharkan fungsi atau fungsi literal:
function f1(){ //... } var f2 = function(){ //... }
Perbezaan antara f1 dan bukan f2 ialah yang pertama berada dalam tempoh tafsiran sintaks dan yang terakhir adalah dalam masa larian. Perbezaannya ialah: jika kod yang memanggil fungsi adalah selepas definisi fungsi, tiada perbezaan jika kod yang memanggil fungsi itu sebelum definisi fungsi, f1 masih boleh dipanggil, tetapi f2 akan melaporkan ralat, mendorong bahawa f2 tidak ditakrifkan.
Semantik 4, simbol tatabahasa untuk pengendalian pengecualian berstruktur:
try { //... }catch( ex ){ //... }finally{ //... }
Terdapat perbezaan antara pendakap di sini dan pernyataan pematuhan (Semantik 1). hanya terdapat satu pernyataan dalam if/else/for, pendakap kerinting boleh ditinggalkan, tetapi cuba/tangkap/akhirnya tidak boleh ditinggalkan.
Saya telah lama bergelut dengan kod berikut:
function(){}() //匿名函数立即执行, 语法分析期报 {}.constructor //获取对象直接量的构造器,语法分析期报错
Apa yang membingungkan ialah mengapa [].pembina ditulis seperti ini tetapi tidak melaporkan ralat dapatkan pembina Pembina kuantiti langsung objek, seseorang hanyalah pembina untuk mendapatkan literal tatasusunan.
Sudah tentu, tiada ralat akan dilaporkan jika anda menambah pembolehubah untuk menerima, var c = {}.constructor;
Dalam situasi yang sama, seperti: var fn = function() {}(), tiada ralat akan dilaporkan .
sebenarnya disebabkan oleh "keutamaan pernyataan" js, iaitu, {} difahami sebagai blok pernyataan majmuk (semantik 1) dan bukannya semantik objek literal (semantik 2) atau fungsi yang diisytiharkan (semantik 3).
function(){}(), kurungan kerinting difahami sebagai pernyataan majmuk Sememangnya, sintaks fungsi pengisytiharan function() sebelumnya tidak lengkap, menyebabkan ralat semasa analisis sintaks. {}.pembina, pendakap kerinting difahami sebagai pernyataan majmuk dan pendakap kerinting diikuti oleh pengendali titik Jika tiada objek munasabah sebelum pengendali titik, ralat secara semula jadi akan dilaporkan.
Pembetulan sudah diketahui: tambah pengendali paksaan ()
(function(){})(), (function(){});//Paksa ia menjadi difahami sebagai fungsi (semantik 3), "Fungsi ()" bermaksud melaksanakan fungsi, iaitu, ia dilaksanakan serta-merta selepas pengisytiharan. ({}).pembina //({}) memaksa pendakap kerinting untuk difahami sebagai literal objek (semantik 2) bermaksud mendapatkan ahli objek Secara semula jadi, pengendali titik seterusnya boleh dilaksanakan secara normal .
function(){}(); Sebab ralat sintaks tiada kaitan dengan operator panggilan fungsi.
Sebab yang penting ialah function(){} secara berkesan mengumpulkan token mengikut tempoh analisis leksikal. fungsi dianggap sebagai elemen token pertama pada kedudukan permulaan Pernyataan Ungkapan ini. Ini tidak dibenarkan oleh EMCA262. Sebab mengapa ia tidak dibenarkan adalah sangat jelas, iaitu, ia takut menyebabkan kekaburan antara ungkapan fungsi dan pengisytiharan fungsi. Anda boleh memahami bahawa kata kunci fungsi tidak boleh berada di tempat pertama dalam ExpressionStaement.
Mari kita lihat pernyataan tugasan f = function(){};
f : LeftHandSideExpression = : AssignmentOperator
function(){}; pada masa ini ia dianggap sebagai bahagian ungkapan tugasan keseluruhan pernyataan, iaitu, AssignmentExpression. Jadi ia lulus semakan tatabahasa secara munasabah dan sah dan menjadi ungkapan fungsi FunctionExpression.
Jadi pada masa ini, walaupun anda f = function(){}();
Cadangan berkaitan: Tutorial pembelajaran javascript
Atas ialah kandungan terperinci Apakah penggunaan kurungan kerinting dalam javascript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!