เครื่องมือจัดฟันมีฟังก์ชันความหมายสี่ฟังก์ชันใน JS
อรรถศาสตร์ 1 จัดระเบียบประโยคประสม ซึ่งเป็นเรื่องธรรมดาที่สุด
คัดลอกรหัสรหัสดังต่อไปนี้:
ถ้า (เงื่อนไข) {
-
}อื่น {
-
-
สำหรับ() {
-
-
ความหมาย 2 การประกาศตามตัวอักษรของวัตถุ
คัดลอกรหัสรหัสดังต่อไปนี้:
วาร์ obj = {
ชื่อ'แจ๊ค'
อายุ: 23
-
ทั้งหมดนี้เป็นข้อความเกี่ยวกับการมอบหมายงาน โดยที่ {name:'jack',age:23} เป็นสำนวน
อรรถศาสตร์ 3 ประกาศฟังก์ชันหรือฟังก์ชันลิเทอรัล
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชัน f1(){
-
-
var f2 = ฟังก์ชัน(){
-
-
ความแตกต่างระหว่าง f1 และไม่ใช่ f2 ก็คืออันแรกอยู่ในช่วงการตีความไวยากรณ์ และอันหลังอยู่ในรันไทม์ ข้อแตกต่างคือ ถ้าโค้ดที่เรียกใช้ฟังก์ชันอยู่หลังคำจำกัดความของฟังก์ชัน ก็ไม่มีความแตกต่างใดๆ หากโค้ดที่เรียกใช้ฟังก์ชันอยู่ก่อนคำจำกัดความของฟังก์ชัน f1 ยังสามารถเรียกใช้ได้ แต่ f2 จะรายงานข้อผิดพลาด โดยแจ้งว่า f2 ไม่ได้ถูกกำหนดไว้
ความหมาย 4 สัญกรณ์ไวยากรณ์สำหรับการจัดการข้อยกเว้นที่มีโครงสร้าง
คัดลอกรหัสรหัสดังต่อไปนี้:
พยายาม {
-
} จับ (เช่น) {
-
}ในที่สุด{
-
-
มีความแตกต่างระหว่างเครื่องหมายปีกกาที่นี่และคำสั่งที่ตรงกัน (ความหมาย 1) หากมีคำสั่งเดียวในเครื่องหมายปีกกา สามารถละเว้นเครื่องหมายปีกกาใน if/else/for ฯลฯ ได้ แต่ try/catch/finally ไม่ได้ ละเว้น
ฉันดิ้นรนกับรหัสต่อไปนี้มาเป็นเวลานาน
คัดลอกรหัสรหัสดังต่อไปนี้:
function(){}() //ฟังก์ชัน Anonymous จะถูกดำเนินการทันที รายงานการวิเคราะห์ไวยากรณ์เป็นระยะ
{}.constructor //รับ Constructor ของ object literal และข้อผิดพลาดจะถูกรายงานในระหว่างการวิเคราะห์ไวยากรณ์
สิ่งที่น่าสงสัยคือทำไม [].constructor ถึงเขียนแบบนี้แต่ไม่ได้รายงานข้อผิดพลาด ตัวหนึ่งคือตัวสร้างที่ต้องการรับค่าโดยตรงของวัตถุ และอีกตัวเป็นเพียงตัวสร้างที่ต้องการรับค่าโดยตรงของ อาร์เรย์
แน่นอนว่าการเพิ่มตัวแปรที่จะรับจะไม่ทำให้เกิดข้อผิดพลาด
var c = {}.ตัวสร้าง;
สถานการณ์เดียวกันก็เป็นเช่นนั้น
var fn = function(){}() จะไม่รายงานข้อผิดพลาด
ในความเป็นจริง "ลำดับความสำคัญของคำสั่ง" ของ js ที่สร้างปัญหา นั่นคือ {} เข้าใจว่าเป็นบล็อกคำสั่งแบบผสม (ความหมาย 1) มากกว่าความหมายของความหมายของวัตถุตามตัวอักษร (ความหมาย 2) หรือฟังก์ชันที่ประกาศ ( ความหมาย 3)
function(){}() วงเล็บปีกกาถือเป็นคำสั่งผสม โดยปกติแล้วไวยากรณ์ของฟังก์ชันการประกาศ function() ก่อนหน้าจะไม่สมบูรณ์ ทำให้เกิดข้อผิดพลาดระหว่างการวิเคราะห์ไวยากรณ์
{}.constructor เครื่องหมายปีกกาจะเข้าใจว่าเป็นคำสั่งผสม และเครื่องหมายปีกกาจะตามหลังด้วยตัวดำเนินการ dot หากไม่มีวัตถุที่สมเหตุสมผลก่อนตัวดำเนินการ dot ข้อผิดพลาดจะถูกรายงานโดยธรรมชาติ
การแก้ไขเป็นที่รู้จักกันดี: เพิ่มตัวดำเนินการบีบบังคับ ()
(function(){})(), (function(){});//บังคับให้เข้าใจว่าเป็นฟังก์ชัน (ความหมาย 3) "function()" หมายถึงการรันฟังก์ชัน กล่าวคือ มันถูกเรียกใช้งานทันที หลังจากการประกาศ
({}).constructor //({}) บังคับให้วงเล็บปีกกาถูกเข้าใจว่าเป็นตัวอักษรของอ็อบเจ็กต์ (ความหมาย 2) "Object.xx" หมายถึงการรับสมาชิกของอ็อบเจ็กต์ โดยธรรมชาติแล้ว ตัวดำเนินการจุดที่ตามมาสามารถดำเนินการได้ตามปกติ .