ฉันมักจะเห็น JavaScript พร้อมตัวแปรที่เริ่มต้นด้วยเครื่องหมายดอลลาร์ เมื่อไหร่ / ทำไมคุณเลือกที่จะนำหน้าตัวแปรด้วยวิธีนี้
(ฉันไม่ได้ถามเกี่ยวกับ$('p.foo')
ไวยากรณ์ที่คุณเห็นใน jQuery และอื่น ๆ แต่ตัวแปรปกติเช่น$name
และ$order
)
ฉันมักจะเห็น JavaScript พร้อมตัวแปรที่เริ่มต้นด้วยเครื่องหมายดอลลาร์ เมื่อไหร่ / ทำไมคุณเลือกที่จะนำหน้าตัวแปรด้วยวิธีนี้
(ฉันไม่ได้ถามเกี่ยวกับ$('p.foo')
ไวยากรณ์ที่คุณเห็นใน jQuery และอื่น ๆ แต่ตัวแปรปกติเช่น$name
และ$order
)
คำตอบ:
การใช้งานทั่วไปมากในjQueryคือการแยกวัตถุjQueryที่เก็บไว้ในตัวแปรจากตัวแปรอื่น ๆ
ตัวอย่างเช่นฉันจะกำหนด:
var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself
ฉันคิดว่านี่เป็นประโยชน์อย่างมากในการเขียนรหัสjQueryและทำให้ง่ายต่อการดูวัตถุjQueryซึ่งมีชุดคุณสมบัติที่แตกต่างกัน
ในรุ่นที่ 1, 2 และ3 ของ ECMAScript การใช้ชื่อตัวแปร $ -prefixed นั้นไม่ได้รับการสนับสนุนอย่างชัดเจนจากข้อมูลจำเพาะยกเว้นในบริบทของรหัสที่สร้างอัตโนมัติ:
เครื่องหมายดอลลาร์ (
$
) และขีดล่าง (_
) ได้รับอนุญาตทุกที่ในตัวระบุ เครื่องหมายดอลลาร์มีไว้สำหรับใช้ในรหัสที่สร้างโดยกลไกเท่านั้น
อย่างไรก็ตามในเวอร์ชันถัดไป ( ฉบับที่ 5ซึ่งเป็นปัจจุบัน) ข้อ จำกัด นี้ถูกยกเลิกและข้อความข้างต้นถูกแทนที่ด้วย
เครื่องหมายดอลลาร์ (
$
) และเครื่องหมายขีด (_
) จะได้รับอนุญาตใดก็ได้ในIdentifierName
ดังนั้นเครื่องหมาย $ อาจถูกใช้อย่างอิสระในชื่อตัวแปร กรอบและห้องสมุดบางแห่งมีอนุสัญญาของตนเองเกี่ยวกับความหมายของสัญลักษณ์ที่ระบุไว้ในคำตอบอื่น
$variable
ก็เป็นไปได้เพราะมันมีวัตถุ jQuery ทั้งหมด
ตามที่คนอื่น ๆ ได้กล่าวถึงเครื่องหมายดอลลาร์มีวัตถุประสงค์เพื่อใช้งานโดยรหัสที่สร้างขึ้นโดยกลไก อย่างไรก็ตามการประชุมดังกล่าวได้ถูกทำลายโดยห้องสมุด JavaScript ที่ได้รับความนิยมอย่างมาก JQuery, Prototype และ MS AJAX (AKA Atlas) ทั้งหมดใช้อักขระนี้ในตัวระบุ (หรือเป็นตัวระบุทั้งหมด)
ในระยะสั้นคุณสามารถใช้$
ทุกครั้งที่คุณต้องการ (ล่ามจะไม่บ่น) คำถามคือเมื่อใดที่คุณต้องการใช้
ฉันเองไม่ได้ใช้มัน แต่ฉันคิดว่าการใช้งานนั้นถูกต้อง ฉันคิดว่า MS AJAX ใช้เพื่อระบุว่าฟังก์ชั่นเป็นนามแฝงสำหรับการโทรที่ละเอียดมากขึ้น
ตัวอย่างเช่น:
var $get = function(id) { return document.getElementById(id); }
ดูเหมือนว่าจะเป็นการประชุมที่สมเหตุสมผล
ในบริบทของ AngularJS $
คำนำหน้านั้นใช้สำหรับตัวระบุในรหัสของกรอบงานเท่านั้น ผู้ใช้งานเฟรมเวิร์กได้รับคำสั่งไม่ให้ใช้ในตัวระบุของตนเอง:
Namespaces เชิงมุม
$
และ$$
เพื่อป้องกันไม่ให้ชนกันอุบัติเหตุชื่อกับรหัสของคุณคำนำหน้าชื่อเชิงมุมของวัตถุกับประชาชนและชื่อของวัตถุส่วนตัวพร้อม
$
$$
กรุณาอย่าใช้$
หรือ$$
คำนำหน้าในรหัสของคุณ
ฉันเป็นคนที่ริเริ่มการประชุมนี้ขึ้นในปี 2549 และเลื่อนขั้นลงในรายชื่อผู้รับจดหมาย jQuery ก่อนดังนั้นให้ฉันแบ่งปันประวัติและแรงบันดาลใจรอบ ๆ
คำตอบที่ยอมรับให้ตัวอย่างนี้:
var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself
แต่นั่นก็ไม่ได้แสดงให้เห็นถึงมันได้ดีนัก แม้ไม่มี$
เราจะยังคงมีสองชื่อตัวแปรที่แตกต่างกันที่นี่และemail
email_field
นั่นเป็นสิ่งที่ดีมากมาย ทำไมเราต้องใส่ชื่อ$
หนึ่งชื่อเมื่อเรามีสองชื่อแตกต่างกัน?
ที่จริงแล้วฉันจะไม่ใช้email_field
ที่นี่ด้วยเหตุผลสองประการ: names_with_underscores
ไม่ใช่ JavaScript ที่ใช้สำนวนและfield
ไม่สมเหตุสมผลสำหรับองค์ประกอบ DOM แต่ฉันก็ทำตามแนวคิดเดียวกัน
ฉันลองทำสิ่งที่แตกต่างกันสองสามอย่างในหมู่พวกเขาคล้ายกับตัวอย่าง:
var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it
(แน่นอนว่าวัตถุ jQuery สามารถมีองค์ประกอบ DOM ได้มากกว่าหนึ่งรายการ แต่รหัสที่ฉันทำงานมีจำนวนมาก id
ตัวเลือกดังนั้นในกรณีเหล่านั้นจะมีการติดต่อ 1: 1)
ฉันมีอีกกรณีที่ฟังก์ชั่นได้รับองค์ประกอบ DOM เป็นพารามิเตอร์และยังต้องการวัตถุ jQuery สำหรับมัน:
// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
var emailJQ = $(email);
// Now email is the DOM element and emailJQ is a jQuery object for it
}
นั่นเป็นความสับสนเล็กน้อย! ในหนึ่งในบิตของรหัสของฉันemail
คือวัตถุ jQuery และemailElement
เป็นองค์ประกอบ DOM แต่ในอื่น ๆemail
เป็นองค์ประกอบ DOM และemailJQ
เป็นวัตถุ jQuery
ไม่มีความสอดคล้องและฉันยังคงผสมพวกเขา นอกจากนี้ยังเป็นเรื่องที่สร้างความรำคาญให้กับการสร้างชื่อที่แตกต่างกันสองชื่อสำหรับสิ่งเดียวกัน: หนึ่งสำหรับวัตถุ jQuery และอีกชื่อหนึ่งสำหรับองค์ประกอบ DOM ที่ตรงกัน นอกจากนี้email
, emailElement
และemailJQ
ฉันเก็บไว้พยายามรูปแบบอื่น ๆ มากเกินไป
จากนั้นฉันสังเกตเห็นรูปแบบทั่วไป:
var email = $("#email");
var emailJQ = $(email);
ตั้งแต่จาวาสคริปต์ถือว่า$
เป็นเพียงตัวอักษรอีกตัวหนึ่งสำหรับชื่อและเนื่องจากฉันได้รับวัตถุ jQuery กลับมาจากการ$(whatever)
โทรรูปแบบในที่สุดก็เริ่มที่ฉัน ฉันสามารถรับ$(...)
สายและลบตัวละครบางตัวออกมาและมันจะเกิดขึ้นพร้อมกับชื่อที่ดีงาม:
$
("#email")$
(email)
การขีดฆ่าไม่สมบูรณ์แบบ แต่คุณอาจได้รับแนวคิด: เมื่อมีการลบอักขระบางตัวทั้งสองบรรทัดจะมีลักษณะดังนี้:
$email
นั่นคือเมื่อฉันรู้ฉันไม่จำเป็นต้องที่จะทำให้การประชุมเหมือนหรือemailElement
emailJQ
นอกจากนั้นแล้วการประชุมที่ดีที่จ้องมองมาที่ผม: ใช้ตัวละครบางตัวออกจากการโทรและมันจะกลายเป็น$(whatever)
$whatever
var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object
และ:
// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
var $email = $(email);
// $email is the jQuery object and email is the DOM object
// Same names as in the code above. Yay!
}
ดังนั้นฉันไม่จำเป็นต้องสร้างชื่อที่แตกต่างกันสองชื่อตลอดเวลา แต่สามารถใช้ชื่อเดียวกันโดยมีหรือไม่มีส่วน$
นำหน้าก็ได้ และ$
คำนำหน้าเป็นการเตือนที่ดีว่าฉันกำลังจัดการกับวัตถุ jQuery:
$('#email').click( ... );
หรือ:
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );
Stevo นั้นถูกต้องความหมายและการใช้สัญลักษณ์ดอลลาร์ (ใน Javascript และแพลตฟอร์ม jQuery แต่ไม่ใช่ใน PHP) นั้นมีความหมายอย่างสมบูรณ์ $ เป็นตัวละครที่สามารถใช้เป็นส่วนหนึ่งของชื่อตัวระบุ นอกจากนี้เครื่องหมายดอลลาร์อาจไม่ใช่สิ่งที่ "แปลก" ที่สุดที่คุณสามารถพบได้ใน Javascript นี่คือตัวอย่างของชื่อตัวระบุที่ถูกต้อง:
var _ = function() { alert("hello from _"); }
var \u0024 = function() { alert("hello from $ defined as u0024"); }
var Ø = function() { alert("hello from Ø"); }
var $$$$$ = function() { alert("hello from $$$$$"); }
ตัวอย่างทั้งหมดข้างต้นจะได้ผล
ลองพวกเขา
อักขระ $ ไม่มีความหมายพิเศษสำหรับกลไก JavaScript มันเป็นเพียงตัวละครที่ถูกต้องอีกตัวหนึ่งในชื่อตัวแปรเช่น az, AZ, _, 0-9, ฯลฯ ...
$
ไม่มีความหมายพิเศษใน JavaScript ระยะเวลา
เนื่องจาก_
ที่จุดเริ่มต้นของชื่อตัวแปรมักจะใช้เพื่อระบุตัวแปรส่วนตัว (หรืออย่างน้อยหนึ่งตั้งใจจะยังคงเป็นส่วนตัว) ฉันพบ$
สะดวกในการเพิ่มหน้านามแฝงสั้น ๆ ของฉันเองในไลบรารีรหัสทั่วไป
ตัวอย่างเช่นเมื่อใช้ jQuery ฉันชอบใช้ตัวแปร$J
(แทนที่จะเป็นเพียง$
) และใช้$P
เมื่อใช้ php.js เป็นต้น
คำนำหน้าทำให้มองเห็นแตกต่างจากตัวแปรอื่น ๆ เช่นตัวแปรคงที่ของฉันเองทำให้ฉันเข้าใจว่ารหัสเป็นส่วนหนึ่งของห้องสมุดหรืออื่น ๆ และมีโอกาสน้อยที่จะขัดแย้งหรือสับสนอื่น ๆ เมื่อพวกเขารู้ว่าการประชุม
นอกจากนี้ยังไม่ทำให้โค้ดยุ่งเหยิง (หรือต้องการการพิมพ์พิเศษ) เช่นเดียวกับชื่อที่ระบุซ้ำทั้งหมดสำหรับการเรียกใช้ไลบรารีแต่ละครั้ง
ฉันชอบที่จะคิดว่ามันคล้ายกับปุ่มปรับเปลี่ยนเพื่อขยายความเป็นไปได้ของปุ่มเดี่ยว
แต่นี่เป็นเพียงการประชุมของฉันเอง
ตามที่ฉันมีประสบการณ์ในช่วง 4 ปีที่ผ่านมามันจะช่วยให้บางคนสามารถระบุได้อย่างง่ายดายว่าตัวแปรชี้ค่า / วัตถุหรือองค์ประกอบ DOM ห่อ jQuery
Ex:
var name = 'jQuery';
var lib = {name:'jQuery',version:1.6};
var $dataDiv = $('#myDataDiv');
ในตัวอย่างข้างต้นเมื่อฉันเห็นตัวแปร "$ dataDiv" ฉันสามารถพูดได้อย่างง่ายดายว่าตัวแปรนี้ชี้ไปที่องค์ประกอบ DOM ห่อ jQuery (ในกรณีนี้มันคือ div) และฉันยังสามารถเรียกใช้เมธอด jQuery ทั้งหมดโดยไม่ต้องห่อวัตถุอีกครั้งเช่น $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find () แทน $ ($ dataDiv) .append ()
หวังว่ามันจะช่วยได้ ดังนั้นในที่สุดอยากจะบอกว่ามันจะเป็นการปฏิบัติที่ดีที่จะทำตามนี้ แต่ไม่จำเป็น
${varname}
เป็นเพียงข้อตกลงการตั้งชื่อผู้พัฒนา jQuery ใช้เพื่อแยกความแตกต่างของตัวแปรที่ถือองค์ประกอบ jQuery
Plain {varname}
ใช้เพื่อเก็บสิ่งของทั่วไปเช่นข้อความและสตริง
${varname}
เก็บองค์ประกอบที่ส่งคืนจาก jQuery
คุณสามารถใช้ล้วน{varname}
เพื่อจัดเก็บองค์ประกอบ jQuery ได้เช่นกัน แต่อย่างที่ฉันได้กล่าวไว้ในตอนแรกสิ่งนี้แยกความแตกต่างจากตัวแปรธรรมดาและทำให้เข้าใจได้ง่ายขึ้นมาก (ลองจินตนาการถึงความสับสนสำหรับตัวแปรธรรมดา .
ตัวอย่างเช่น :
var $blah = $(this).parents('.blahblah');
ที่นี่ blah กำลังเก็บองค์ประกอบ jQuery ที่ส่งคืน
ดังนั้นเมื่อมีคนอื่นเห็น$blah
ในรหัสพวกเขาจะเข้าใจว่ามันไม่ใช่แค่สตริงหรือตัวเลขมันเป็นองค์ประกอบ jQuery
แม้ว่าคุณสามารถใช้เพื่อนำหน้าตัวระบุของคุณได้ แต่ก็ควรใช้เป็นรหัสที่สร้างขึ้นเช่นโทเค็นการแทนที่ในเทมเพลตเป็นต้น
$ ถูกใช้เพื่อ DISTINGUISH ระหว่างตัวแปรทั่วไปและตัวแปร jquery ในกรณีของตัวแปรปกติ ให้คุณวางคำสั่งซื้อใน FLIPKART จากนั้นถ้าคำสั่งนั้นเป็นตัวแปรที่แสดงให้คุณเห็นถึงผลลัพธ์ของสายอักขระมันจะถูกตั้งชื่ออย่างง่าย ๆ ว่า "คำสั่ง" แต่ถ้าเราคลิกคำสั่งซื้อแล้ววัตถุจะถูกส่งคืน คำสั่ง "เพื่อให้โปรแกรมเมอร์สามารถตัดตัวแปร javascript และตัวแปร jquery ในรหัสทั้งหมด
หากคุณเห็นเครื่องหมายดอลลาร์ ($) หรือเครื่องหมายดอลลาร์สอง ($$) และอยากรู้ว่าสิ่งนี้มีความหมายอย่างไรในกรอบงานต้นแบบนี่คือคำตอบของคุณ:
$$('div');
// -> all DIVs in the document. Same as document.getElementsByTagName('div')!
$$('#contents');
// -> same as $('contents'), only it returns an array anyway (even though IDs must be unique within a document).
$$('li.faux');
// -> all LI elements with class 'faux'
เหตุผลที่ฉันใช้ php name-conventions กับตัวแปร javascript: บางครั้งเมื่อทำการตรวจสอบอินพุตฉันต้องการรันอัลกอริทึมแบบเดียวกันทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์ ฉันต้องการให้โค้ดสองด้านดูคล้ายกันมากที่สุดเพื่อให้การบำรุงรักษาง่ายขึ้น การใช้เครื่องหมายดอลลาร์ในชื่อตัวแปรทำให้ง่ายขึ้น
(นอกจากนี้ฟังก์ชั่นตัวช่วยบางส่วนที่ช่วยทำให้โค้ดดูคล้ายกันเช่นการตัดการค้นหา - ค่า - การค้นหา strlen เวอร์ชั่นที่ไม่ใช่ OO ฯลฯ ยังคงต้องใช้การปรับแต่งเอง)
ตัวระบุ JavaScript ที่ถูกต้อง shuold จะต้องเริ่มต้นด้วยตัวอักษรขีดล่าง (_) หรือเครื่องหมายดอลลาร์ ($); อักขระที่ตามมาสามารถเป็นตัวเลขได้ (0-9) เนื่องจาก JavaScript เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ตัวอักษรจึงประกอบด้วยอักขระ "A" ถึง "Z" (ตัวพิมพ์ใหญ่) และตัวอักษร "a" ถึง "z" (ตัวพิมพ์เล็ก)
รายละเอียด:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables