ອົງການ Function ECMAScript (ວິທະຍາການ)
- ບ່ອນກ່ອນ ບັນດາຂໍ້ມູນ arguments
- ບ່ອນຕໍ່ໄປ ການປິດກັນ (closure)
ພາສານລະບົບ ECMAScript ພວກເລົ່ານັ້ນແມ່ນອຸປະກອນທີ່ມີພາສານປະສົມຫຼາຍ.
ພາສານລະບົບ Function (ພາສານລະບົບ)
ພາສານລະບົບ ECMAScript ທີ່ສຳຄັນທີ່ສຸດແມ່ນວ່າຕົວເລື່ອງພວກເລົ່ານັ້ນແມ່ນອຸປະກອນທີ່ມີພາສານປະສົມຫຼາຍ.
ພາສານລະບົບ Function ສາມາດສະແດງຕົວເລື່ອງທີ່ນັກພັດທະນາອອກມາໄດ້.
ພາສານລະບົບ Function ທີ່ຈະສ້າງຕົວເລື່ອງພວກເລົ່ານັ້ນແມ່ນ:
var function_name = new function(arg1, arg2, ..., argN, function_body)
ໃນຮູບແບບນີ້, ທຸກຄວາມ arg ທັງສອງຄວາມ, ສຸດຄວາມແມ່ນບັນດາຄູ່ມູນທີ່ຈະດຳເນີນການວຽກ (ການດຳເນີນການຫຼັງຈາກ).
ຍັງມີຄວາມທີ່ພວກເຈົ້າຈື່ງຍັງຮູ້ບໍ່?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
ຫຼາຍຢ່າງນີ້ກໍ່ຈະສາມາດກໍານົດງານວ່າ:
var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
ເຖິງວ່າການຂຽນນີ້ຈະມີຄວາມຫຼາຍຢູ່ທາງຈາກຄຳແບບ, ມັນຈະຊ່ວຍຈາກການເຂົ້າໃຈວ່າບັນດາຄູ່ມູນວຽກພຽງແຕ່ບັນດາຄວາມຂອງຊະນິດນິວເຊີຍ, ທີ່ມີພາລະກິດທີ່ຄືກັບບັນດາຄູ່ມູນວຽກທີ່ຖືກກໍານົດງານດ້ວຍ Function 类.
ບັນດາຄວາມນີ້:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //ອອກຜົນ "20"
ຄວາມທີ່ທ່ານຮູ້, ບັນດາຄູ່ມູນວຽກຄັ້ງທີສອງໄດ້ຂຽນກັບຄູ່ມູນວຽກຄັ້ງທີໜຶ່ງ, ທີ່ doAdd(10) ອອກຜົນ "20", ບໍ່ແມ່ນ "30".
ຖ້າຄວາມນີ້ຖືກຂຽນອີກຄັ້ງທີ່ນັ້ນ, ຄວາມນີ້ຈະຫຼາຍກວ່າ:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
ບັນດາຄວາມນີ້ພວກເຈົ້າບັນດາຄວາມວ່າ doAdd ໄດ້ຖືກປ່ຽນຄືນເປັນອີກຄູ່ມູນຊະນິດວຽກທີ່ບໍ່ອາດຈະກັນ. ບັນດາຄວາມວຽກພຽງແຕ່ບັນດາຄວາມທີ່ຝັງໃສ່ຄູ່ມູນວຽກ. ແລະຄວາມສາມາດອອກຜົນທີ່ບໍ່ອາດຈະກັນທີ່ຫຼາຍ:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //ອອກຜົນ "20" alsodoAdd(10); //ອອກຜົນ "20"
ຢູ່ນີ້ຫຼາຍຢ່າງວ່າບັນດາຄວາມ doAdd ໄດ້ຖືກກໍານົດງານວ່າຄູ່ມູນຊະນິດວຽກຫຼັງຈາກນັ້ນ alsodoAdd ໄດ້ຖືກຖະແຫຼງໃຫ້ຝັງໃສ່ຄູ່ມູນຊະນິດວຽກດຽວກັນ. ທັງສອງບັນດາຄວາມນີ້ສາມາດດຳເນີນການວຽກບັນດາຄວາມນີ້ແລະອອກຜົນກັບການພິຈາລະນາທີ່ດຽວ - "20". ຖ້າຊື່ປະເພດຂອງຄູ່ມູນວຽກພຽງແຕ່ບັນດາຄວາມທີ່ຝັງໃສ່ຄູ່ມູນວຽກຫຼັງຈາກນັ້ນ, ຄວາມສາມາດບັນດາຄູ່ມູນວຽກສາມາດຖືກສົ່ງໄປຫາຄູ່ມູນວຽກອື່ນອີກຫຼືບໍ່?
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //输出 "20"
在上面的例子中,callAnotherFunc() 有两个参数 - 要调用的函数和传递给该函数的参数。这段代码把 doAdd() 传递给 callAnotherFunc() 函数,参数是 10,输出 "20"。
ເຫັນວ່າ:ເຖິງວ່າສາມາດໃຊ້ພະຍານ Function 构造函数 ເພື່ອສ້າງຫົວຫນັງ, ບໍ່ຕ້ອງໃຊ້ມັນ, ຍ້ອນວ່າມັນມີຄວາມຊ້າຫຼາຍກວ່າວິທີການດັ້ງເດີມ. ແຕ່ວ່າທຸກຫົວຫນັງທຸກຄົນຄວນເປັນພະຍານຂອງປະເພດ Function.
ສະຖານະພາບ length ຂອງ Function Object
ຄືກັບທີ່ກ່າວໄວ້ກ່ອນ, ຫົວຫນັງຢູ່ໃນປະເພດການປະກອບຄວາມຂອງຄຳຂັດແຍ່ງ, ພວກເຂົາກໍ່ມີສະຖານະພາບ ແລະ ວິທີການ.
ສະຖານະພາບ length ທີ່ມີຂອງ ECMAScript ແມ່ນກ່ຽວກັບຈຳນວນຫຼັກຕົວຄວາມທີ່ຫົວຫນັງຄວາມຄາດຫວັງ. ເປັນບັນທຶກ:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //ການກະທຳ "1" alert(sayHi.length); //ການກະທຳ "0"
ຫົວຫນັງ doAdd() ມີຫຼັກຕົວຄວາມດຽວ, ຍັງມີ length ທີ່ 1; sayHi() ບໍ່ມີຫຼັກຕົວຄວາມ, ຍັງມີ length ທີ່ 0.
ຊົງໄວ້ວ່າ, ບໍ່ວ່າຈະມີຫຼາຍວິທີການທີ່ຖືກກໍານົດ, ECMAScript ສາມາດຍອມຮັບວິທີການຫຼາຍຢ່າງຫຼາຍ (ສູງສູງ 25ວິທີການ), ມັນຖືກບັນທຶກໃນວັດສະດຸ 'ການວິວັດວິນານຂອງຫົວຫນັງ'. ສະຖານະພາບ length ແມ່ນພຽງແຕ່ວິທີການສະຫຼາກຫຼາຍຢ່າງຫຼາຍໃນການທົດລອງຄືກັນກັບຄວາມຄາດຫວັງວິທີການທີ່ຖືກກໍານົດ.
ວິທີການ Function Object
Function Object ມີວິທີການ valueOf() ແລະ toString() ທີ່ເປັນເພີງຄືກັນກັບບັນດາໂອລເບີກ. ສອງວິທີດັ່ງກ່າວກໍ່ເປັນຂໍ້ມູນຂອງບົດກະດີຂອງຫົວຫນັງໃນການທົດລອງຫຼາຍຢ່າງຫຼາຍ. ສະຖານະພາບ length ແມ່ນເປັນວິທີການສະຫຼາກຫຼາຍຢ່າງຫຼາຍໃນການທົດລອງ.
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
ການປະກອບຂໍ້ຄວາມຂອງຫົວຫນັງ doAdd()ທ້າທາຍດັ່ງກ່າວ!
- ບ່ອນກ່ອນ ບັນດາຂໍ້ມູນ arguments
- ບ່ອນຕໍ່ໄປ ການປິດກັນ (closure)