เราควรใช้การยกใน Javascript เมื่อไรและที่ไหน


11

ฉันใหม่กับ Javascript ฉันเรียนรู้แนวคิดของการชักรอกใน Javascript
จากบทเรียนของ Javacsript ในเว็บไซต์Mozillaผมเจอคำhoistingนี้ ตามบทเรียนเหล่านั้นตัวแปรใน JavaScript คือการที่คุณสามารถอ้างถึงตัวแปรที่ประกาศในภายหลังโดยไม่ได้รับการยกเว้น แต่คำถามของฉันเกี่ยวกับสถานการณ์ที่เหมาะสมที่จะใช้การยกใน Javascript ฝั่งไคลเอ็นต์หรือทำไมเราควรใช้การยกใน Javascript ข้อดีของมันคืออะไร


1
การแชร์งานวิจัยของคุณช่วยให้ทุกคน บอกเราว่าคุณได้ลองทำอะไรและทำไมมันถึงไม่ตรงกับความต้องการของคุณ สิ่งนี้แสดงให้เห็นว่าคุณใช้เวลาในการพยายามช่วยตัวเองมันช่วยให้เราไม่ต้องย้ำคำตอบที่ชัดเจนและส่วนใหญ่จะช่วยให้คุณได้คำตอบที่เฉพาะเจาะจงและเกี่ยวข้องมากขึ้น ดูวิธีถาม
gnat

6
หลังจากที่ทุก @gnat วิจัยถ้าฉันได้เข้าใจหัวข้อนี้ทำไมจะฉันได้โพสต์คำถามนี้ที่นี่เพื่อหารือและเข้าใจแนวคิดได้อย่างถูกต้อง
Rudra

2
@Rudra นี้ไม่ได้เป็นอภิปรายฟอรั่ม ยิ่งกว่านั้นคุณยังไม่ได้แสดงหลักฐานใด ๆที่คุณได้ทำการวิจัยนี้
Doval

5
ใช่ แต่ไม่ใช่ข้อกำหนดสำหรับการถามคำถาม
Robert Harvey

2
@Rudra: โปรดจำไว้ว่าเราไม่ใช่ฟอรัมสนทนา จริงๆแล้วเราเป็นเว็บไซต์ถาม - ตอบ คำถามที่ถามที่นี่ควรถูกกำหนดขอบเขตเพื่อให้ตอบได้อย่างสมเหตุสมผลในรูปแบบคำถาม & คำตอบ
Robert Harvey

คำตอบ:


11

ฉันไม่เคยได้ยินคำว่า "hoisting" มาใช้ หากคุณอ้างถึงการใช้งานของการชักรอกโดยเบ็นเชอร์รี่: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.htmlจากนั้นจากสิ่งที่ฉันสามารถรวบรวมได้เขาก็แค่สะท้อน Douglas Crockford จากJavascript: The ส่วนที่ดีและบอกว่าคุณควรไม่เคย ใช้รอก การยืนยันของเขาในตอนท้ายคือตัวแปรทั้งหมดควรถูกประกาศที่ด้านบนสุดของฟังก์ชั่นของคุณ (ตามที่ Crockford และ JSLint แนะนำ)

หรือในคำพูดของนายคริสโตเฟอร์บราวน์มันไม่ได้เป็นคุณสมบัติที่ใช้งานได้แต่พูดถึงเรื่องที่เกี่ยวข้องกับวิธีที่เบราว์เซอร์ตีความจาวาสคริปต์

ดังนั้นในระยะสั้น: ไม่เคยและไม่มีที่ไหนเลย


1
จากนั้นเหตุใดจึงมีแนวคิดนี้รวมถึงคุณลักษณะนี้เกี่ยวกับอะไร
Rudra

@Rudra: หัวข้อย่อย "การประกาศชื่อและการชักรอก" ในบทความที่ David เชื่อมโยงดูเหมือนจะครอบคลุมเรื่องนี้ค่อนข้างดี ส่วนไหนไม่ชัดเจน?
Robert Harvey

@ RobertHarvey ฉันแค่อยากรู้ว่าที่ไหนและเมื่อไหร่ที่พวกเขาใช้สิ่งนี้ เดวิดบอกว่ามันไม่เคยถูกใช้และไม่มีที่ไหนเลย แต่ทำไมมันถึงแสดงเป็นฟีเจอร์
Rudra

4
เพียงเพราะสิ่งที่มีคุณสมบัติไม่ได้หมายความว่ามันเป็นความคิดที่ดี มีสาเหตุหลายประการที่ทำให้ "คุณสมบัติ" หลุดลอยไป แม้แต่ภาคผนวกของคุณก็ไม่มีจุดประสงค์ที่เป็นประโยชน์แม้ว่ามันจะเป็นไปได้ในยุคมนุษย์ถ้ำก็ตาม
Robert Harvey

1
HOisting เป็นคำศัพท์จากทฤษฎีคอมไพเลอร์ เป็นเวลาอย่างน้อย 20 ปี แต่ได้รับความนิยมจาก Javascript ที่มีลักษณะเฉพาะนี้ ถ้ามันไม่ได้เรียกว่าคุณสมบัติมันอาจจะเป็นข้อผิดพลาด
david.pfx

16

Hoisting อธิบายคุณสมบัติของ Javascript ที่ตีความโดยเบราว์เซอร์และคุณลักษณะที่ใช้ไม่มาก

เมื่อตีความ Javascript เบราว์เซอร์จะวางขอบเขตตัวแปรระดับฟังก์ชั่นไว้ที่จุดเริ่มต้นของฟังก์ชัน ตัวอย่าง:

function AddTwoAndTwo() {
    var two = 2;
    var result = two + two;
    return result;
}

ในโค้ดที่โพสต์ตัวแปรทั้งสอง "สอง" และ "ผลลัพธ์" มีอยู่ที่จุดเริ่มต้นของขอบเขตฟังก์ชัน (เห็นได้ชัดว่ามีการประกาศไว้ที่นั่น) อย่างไรก็ตามเนื่องจากเบราว์เซอร์ "ยก" ตัวแปรดังต่อไปนี้จะกลายเป็นรหัสจาวาสคริปต์ตามกฎหมาย .

function AddTwoAndTwo() {
    result = 5;
    alert(result);
    var two = 2;
    var result = two + two;
    return result;
}

ผลกระทบสุทธิที่นี่คือคุณมีตัวแปรที่ใช้งานก่อนที่คุณจะประกาศพวกเขาและที่อาจทำให้เกิดความสับสนโดยเฉพาะอย่างยิ่งกับตัวแปรขอบเขตทั่วโลก ตัวอย่าง:

var result = 6;

function AddTwoAndTwo() {
    alert(result);  // should this be 6 or undefined?
    var two = 2;
    var result = two + two;
    return result;
}

เพื่อหลีกเลี่ยงความสับสนให้ประกาศตัวแปรของคุณที่ด้านบนของฟังก์ชั่น


4
+1: นี่คือวิธีที่ฉันจะตอบ มันไม่ใช่คุณสมบัติที่จะใช้หรือไม่ใช้มันเป็นเพียงคุณสมบัติของสภาพแวดล้อมที่ต้องคำนึงถึง
scrwtp

1

ทำไม?

JavaScript ไม่มีขอบเขตการบล็อกซึ่งควรอธิบายว่าทำไมสิ่งต่าง ๆ จึงควรยกขึ้นไปด้านบน

มันมีประโยชน์หรือไม่

หากคุณต้องการสิ่งนี้:

var someVariable = someVariable || {};

แทนสิ่งนี้:

if ( "undefined" !== typeof someVariable ) {
    someVariable = someVariable;
} else {
    someVariable = {};
}

แล้วมันมีประโยชน์ แม้ว่าคุณจะไม่สังเกตเห็นก็ตาม!

ชี้แจง

ตัวอย่างแรกจะแปลเป็นดังนี้:

var someVariable = someVariableValue;

if ( "undefined" !== typeof someVariable ) {
    var someVariableValue = someVariable;
} else {
    var someVariableValue = {};
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.