ජාවාස්ක්‍රිප්ට් හි “දැඩි ලෙස භාවිතා කිරීම” කරන්නේ කුමක්ද? එය පිටුපස ඇති හේතුව කුමක්ද?


7551

මෑතකදී, මම මගේ ජාවාස්ක්‍රිප්ට් කේත කිහිපයක් ක්‍රොක්ෆෝර්ඩ් හි ජේඑස්ලින්ට් හරහා ධාවනය කළ අතර එය පහත දෝෂය ලබා දුන්නේය:

1 වන පේළියේ ගැටලුව: "දැඩි ලෙස භාවිතා කරන්න" ප්‍රකාශය අස්ථානගත වී ඇත.

යම් සෙවීමක් කරමින්, සමහර අය "use strict";ඔවුන්ගේ ජාවාස්ක්‍රිප්ට් කේතයට එකතු කරන බව මට වැටහුණි . මම ප්‍රකාශය එක් කළ පසු, දෝෂය දර්ශනය වීම නතර විය. අවාසනාවකට මෙන්, ගූගල් විසින් මෙම වචන ප්‍රකාශය පිටුපස ඇති ඉතිහාසය බොහෝමයක් හෙළි නොකළේය. ජාවාස්ක්‍රිප්ට් බ්‍රව්සරය විසින් අර්ථ නිරූපණය කරන්නේ කෙසේද යන්නට නිසැකවම එය සම්බන්ධ විය යුතුය, නමුත් එහි ප්‍රති what ලය කුමක් වේදැයි මා දන්නේ නැත.

ඉතින් "use strict";සියල්ල ගැන කුමක් ද, එයින් ගම්‍ය වන්නේ කුමක්ද, එය තවමත් අදාළ ද?

වර්තමාන බ්‍රව්සර් වලින් එකක් නූලට ප්‍රතිචාර දක්වන්නේද "use strict";නැතහොත් එය අනාගත භාවිතය සඳහාද?


5
මෙහි පිළිතුරු පැරණි නමුත් ඒවා වැරදිය. දැඩි මාදිලිය සඳහා ප්‍රධාන හේතුව වූයේ ක්‍රමලේඛන දෝෂ වැළැක්වීම නොවේ - එය ජාවාස්ක්‍රිප්ට් ශබ්දකෝෂයෙන් පරික්ෂා කිරීම නිසා එය සංඛ්‍යානමය වශයෙන් විශ්ලේෂණය කළ හැකි ය:]
බෙන්ජමින්

En බෙන්ජමින් ග ru න්බෝම් "use strict";තනිවම භාවිතා කිරීමෙන් ජේඑස් ශබ්ද කෝෂයට යටත් නොවේ. සමඟ විචල්යයන් ප්රකාශ කිරීම letසහ constභාවිතා කළ යුතුය.
කුරොෂ් පැසෝකි

ඔබ බ්ලොක් විෂය පථය සහ ශබ්දකෝෂ විෂය පථය අතර මිශ්‍ර වෙමින් සිටී.
බෙන්ජමින් ග ru න්බෝම්

Answers:


4939

ජාවාස්ක්‍රිප්ට් දැඩි ප්‍රකාරය පිළිබඳ මෙම ලිපිය ඔබට උනන්දුවක් දැක්විය හැකිය: ජෝන් රෙසිග් - ඊසීඑම්එස්ක්‍රිප්ට් 5 දැඩි ප්‍රකාරය, ජේඑස්ඕඑන් සහ තවත්

රසවත් කොටස් කිහිපයක් උපුටා දැක්වීමට:

දැඩි ප්‍රකාරය යනු ECMAScript 5 හි නව අංගයක් වන අතර එමඟින් “දැඩි” මෙහෙයුම් සන්දර්භයක් තුළ වැඩසටහනක් හෝ ශ්‍රිතයක් තැබීමට ඉඩ ලබා දේ. මෙම දැඩි සන්දර්භය තුළ ඇතැම් ක්‍රියාමාර්ග ගැනීම වලක්වන අතර තවත් ව්‍යතිරේකයන් විසි කරයි.

හා:

දැඩි මාදිලිය ආකාර කිහිපයකින් උපකාරී වේ:

  • එය පොදු කේතීකරණ බ්ලූපර් කිහිපයක් අල්ලා ගනී.
  • සාපේක්ෂව “අනාරක්ෂිත” ක්‍රියාමාර්ග ගන්නා විට (ගෝලීය වස්තුව වෙත ප්‍රවේශය ලබා ගැනීම වැනි) එය දෝෂ වළක්වයි.
  • එය අවුල් සහගත හෝ දුර්වල ලෙස සිතූ අංග අක්‍රීය කරයි.

ඔබට සම්පූර්ණ ගොනුවට "දැඩි මාදිලිය" යෙදිය හැකි බව සලකන්න ... නැතහොත් ඔබට එය භාවිතා කළ හැක්කේ නිශ්චිත කාර්යයක් සඳහා පමණි (තවමත් ජෝන් රෙසිග්ගේ ලිපියෙන් උපුටා දක්වමින්) :

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

ඔබට පැරණි සහ නව කේත මිශ්‍ර කිරීමට අවශ්‍ය නම් එය ප්‍රයෝජනවත් විය හැකිය ;-)

ඉතින්, මම හිතන්නේ එය "use strict"ඔබට පර්ල් හි භාවිතා කළ හැකි තරමට සමාන ය (එබැවින් නම?) : එය බිඳවැටීම් වලට තුඩු දිය හැකි තවත් බොහෝ දේ සොයා ගැනීමෙන් අඩු දෝෂයන් කිරීමට ඔබට උපකාරී වේ.

දැඩි මාදිලිය දැන් සියලුම ප්‍රධාන බ්‍රව්සර් මගින් සහය දක්වයි .

ඇතුළත දේශීය සම්මතයන් මොඩියුල (සමග importහා exportප්රකාශ) සහ ES6 පන්ති , දැඩි මාදිලිය සෑම විටම සක්රීය වන අතර ආබාධිත විය නොහැක.


100
වසර ගණනාවකට පසු පෙරනිමිය වෙනස් කිරීම? ඒ සඳහා ප්‍රමාද වැඩියි: එය දැනට පවතින බොහෝ වෙබ් අඩවි / ස්ක්‍රිප්ට් / යෙදුම් බිඳ දමනු ඇත ... හැකි එකම දෙය අනාගතය සඳහා දේවල් වඩා හොඳ කිරීමට උදව් කිරීමයි.
පැස්කල් මාටින්

14
"use strict"ෆයර්ෆොක්ස් 3.6, සෆාරි 5, ක්‍රෝම් 7 සහ ඔපෙරා 10.6 (සියලුම මැක්) භාවිතා කරන විට වලංගු නොවන කුඩා කේත ස්නිපටයක් මම උත්සාහ කළෙමි . කිසිදු දෝෂයක් නොමැත, එබැවින් මම අනුමාන කරන්නේ 'දැඩි ලෙස භාවිතා කිරීම' තවමත් කිසිදු බ්‍රව්සරයක සහය නොදක්වන බවයි. IE9 හි පරීක්‍ෂා කර නැත;)
හස්කි

11
ඉක්මන් යාවත්කාලීන කිරීම: ෆයර්ෆොක්ස් 4 හි දැඩි මාදිලිය සඳහා පූර්ණ සහය ඇත, මට කිව හැකි පරිදි වෙනත් බ්‍රව්සරයක් එයට සහාය නොදක්වයි. සෆාරි සහ ක්‍රෝම් වලට "අර්ධ" සහය ඇත, නමුත් එහි තේරුම කුමක්දැයි මම නොදනිමි.
සාෂා චෙඩිගොව්


12
Ul ජුලියස් - වෙන් කළ යතුරු පදයක් භාවිතයෙන් මෙය ක්‍රියාත්මක කළ නොහැක, මන්ද දැඩි මාදිලිය අවුලුවාලීමට උත්සාහ කරන කේතය පැරණි බ්‍රව්සර් තුළ කැඩී යනු ඇත. “අහඹු” නූලක් වචනාර්ථයෙන් එකතු කිරීමෙන් කිසිවක් බිඳෙන්නේ නැත.
nnnnnn

1245

එය ECMAScript 5 හි නව ලක්ෂණයකි. ජෝන් රෙසිග් එහි සාරාංශයක් ලියා ඇත .

එය ඔබගේ ජාවාස්ක්‍රිප්ට් ලිපිගොනු වල (ඔබේ ගොනුවේ ඉහළින් හෝ ශ්‍රිතයක ඇතුළත) දමා ඇති නූලක් පමණි:

"use strict";

එය දැන් ඔබේ කේතයට ඇතුළත් කිරීමෙන් එය වර්තමාන නූලක් බැවින් වර්තමාන බ්‍රව්සර් සමඟ කිසිදු ගැටළුවක් ඇති නොවිය යුතුය. ඔබගේ කේතය ප්‍රායෝගිකව උල්ලං if නය කරන්නේ නම් එය අනාගතයේදී ඔබේ කේතය සමඟ ගැටලු ඇති කළ හැකිය. උදාහරණයක් ලෙස, ඔබ සතුව පළමුව foo = "bar"නිර්වචනය නොකර තිබේ නම් foo, ඔබේ කේතය අසමත් වීමට පටන් ගනී ... එය මගේ මතය අනුව හොඳ දෙයකි.


329
වේගයෙන් අසමත් වී හයියෙන් අසමත් වන්න.
නීල්ස් බෝම්

31
ඔබ HTML ලිපිගොනු වල ජාවාස්ක්‍රිප්ට් පේළිය ලියන්නේ නම්, සෑම නව වාරණයක්ම ආරම්භ කරන්න <script>"use strict";. ධජය අදාළ වන්නේ එය ඇතුළත් කර ඇති බ්ලොක් එකට පමණි.
නොබාර්

7
එය විහිලුවක්, මෙහි ප්‍රති string ලයක් ලෙස නූල් වලට තනි උපුටා දැක්වීම් තිබිය යුතුය. එබැවින් ඒ 'use strict';වෙනුවට ලියන්න
nilsi

1
එසේ නම් ජාවාස්ක්‍රිප්ට් එසවීමේ සංකල්පයට කුමක් සිදුවේද?
සුනිල් ෂර්මා

1
Un සුනිල්ෂර්මා ඔබ එසවීමට උත්සාහ කළත්, විචල්‍යය නිර්වචනය කර නොමැති නිසා එය අසාර්ථක වේ, මේ මොහොතේ එය ගෝලීය වස්තුවට එකතු කරනු ඇත. සමඟ "use strict";, ඒ වෙනුවට එය අසාර්ථක වනු ඇත. මෙය වඩාත් අර්ථවත් කරයි, මන්ද එය එය ගෝලීය වස්තුවට එකතු කරන්නේ නම් එයින් අදහස් වන්නේ ඔබ ඊළඟ වතාවේ ශ්‍රිතය ක්‍රියාත්මක නොකරන විට / වාරණය නැවත සකස් කරන වෙනත් දෙයක් කළ හැකි බැවින් එය ඉහළම කොටසෙහි (ගෝලීය) ඇති බැවිනි.
wizzwizz4

646

ප්‍රකාශය "use strict";බ්‍රව්සරයට දැඩි මාදිලිය භාවිතා කරන ලෙස උපදෙස් දෙයි, එය ජාවාස්ක්‍රිප්ට් හි අඩු සහ ආරක්ෂිත අංග කට්ටලයකි.

විශේෂාංග ලැයිස්තුව (පරිපූර්ණ නොවන)

  1. ගෝලීය විචල්‍යයන් තහනම් කරයි. ( varවිචල්‍ය නම් වල නැතිවූ ප්‍රකාශ සහ යතුරු ලියනය අල්ලා ගනී )

  2. නිශ්ශබ්දව අසමත් වීම පැවරුම් දැඩි ප්‍රකාරයේදී (පැවරුම් NaN = 5;)

  3. ඉවත් කළ නොහැකි ගුණාංග මකා දැමීමට උත්සාහ කිරීම ( delete Object.prototype)

  4. වස්තුවක ඇති සියලුම දේපල නම් අද්විතීය වීමට අවශ්‍ය වේ ( var x = {x1: "1", x1: "2"})

  5. ක්‍රියාකාරී පරාමිති නම් අද්විතීය විය යුතුය ( function sum (x, x) {...})

  6. අෂ්ටක වාක්‍ය ඛණ්ඩය var x = 023;තහනම් කරයි (පෙර ඇති ශුන්‍යය සංඛ්‍යා වෙනස් කිරීමට කිසිවක් නොකරයි යැයි සමහර ඩිව්ස් වැරදියට උපකල්පනය කරයි.)

  7. withමූල පදය තහනම් කරයි

  8. eval දැඩි ප්‍රකාරයේදී නව විචල්‍යයන් හඳුන්වා නොදේ

  9. සරල නම් මකා දැමීම තහනම් කරයි ( delete x;)

  10. නම් evalසහ argumentsඕනෑම ආකාරයකින් බැඳීම හෝ පැවරීම තහනම් කරයි

  11. දැඩි මාදිලිය argumentsවිධිමත් පරාමිතීන් සමඟ වස්තුවෙහි ගුණාංග අන්වර්ථ නොකරයි . (එනම් function sum (a,b) { return arguments[0] + b;}මෙය ක්‍රියාත්මක වන්නේ arguments[0]ඊට aහා බැඳී ඇති බැවිනි .)

  12. arguments.callee සහාය නොදක්වයි

[Ref: දැඩි ප්‍රකාරය , මොසිල්ලා සංවර්ධක ජාලය ]


40
Nit: ගෝලීය විචල්‍යයන්ට අවසර ඇත, පැහැදිලි විය යුතුය (උදා window.foo = bar).
gcampbell

1
වස්තුවක ඇති සියලුම දේපල නම් අද්විතීය විය යුතුය (var x = {x1: "1", x1: "2"}) මෙය වලංගු වේ
අරුන් කිලු

4
11 හි ඔබගේ උදාහරණයේ a හි වෙනස් කිරීමක් නොමැත (එසේ නොමැතිනම් එය තේරුමක් නැත). I. ඊ. ශ්‍රිත එකතුව (a, b) {a = 0; ආපසු තර්ක [0] + ආ; al අන්වර්ථකරණය හේතුවෙන් අනතුරු ඇඟවීම (එකතුව (1, 2)) දැඩි මාදිලියකින් 3 ක් සහ දැඩි මාදිලියකින් තොරව 2 ක් ආපසු එනු ඇත.
ඩේවිඩ් ගවුස්මන්

413

use strictඑය භාවිතා කිරීම ගැන මිනිසුන් කනස්සල්ලට පත්ව සිටී නම් මෙම ලිපිය පරීක්ෂා කිරීම වටී:

ECMAScript 5 බ්‍රව්සර්වල 'දැඩි ප්‍රකාරය' සහාය. මෙමගින් කුමක් වෙයිද?
NovoGeek.com - ක්‍රිෂ්ණාගේ වෙබ් ලොග්

එය බ්‍රව්සර් සහාය ගැන කතා කරයි, නමුත් වඩා වැදගත් වන්නේ එය ආරක්ෂිතව ගනුදෙනු කරන්නේ කෙසේද:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/

116
මම එකඟවෙන්නේ නැහැ. මම හිතන්නේ මෙය ඉතා ප්‍රයෝජනවත් වන්නේ මන්දැයි පෙන්වයි. සාරාංශයක් ලෙස එයින් අදහස් වන්නේ මෙය එහි ක්‍රියාකාරිත්වය නැවත ලබා දෙන බවයිwindow
ජේමි හට්බර්

36
ඔබට thisඉලක්ක කළ නොහැකි කවුළුව ඔබට කවදා හෝ අවශ්‍යද window?
ජේමි හට්බර්

14
එය තමාටම යොමු වේ. thisඅයිති වන්නේ එහි ක්‍රියාකාරිත්වයට මිස ගෝලීය කවුළුවට නොවේ
ජේමි හට්බර්

26
දෙවැන්න thisඇත්ත වශයෙන්ම ය undefined.
බ්‍රොක්සියර්

14
කාරණය වන්නේ ගෝලීය වස්තුව මත නිහ ly ව වැරදි දේ කරනවා වෙනුවට නිර්වචනය නොකළ දේපලකට ප්‍රවේශ වීම නිසා ඔබේ JS වැඩසටහන අසාර්ථක වීමට පටන් ගැනීමයි. සියුම් දෝෂ සොයා ගැනීම පහසු කරයි.
ස්ටීවන් චුන්

208

පරිස්සම් සහගත වචනයක්, ඔබ දැඩි ලෙස අය කරන ක්‍රමලේඛකයින්: "use strict"පවතින කේතයට අයදුම් කිරීම අනතුරුදායක විය හැකිය! මෙම දෙය ඔබට 'වඩා හොඳ' බවට පත් කිරීම සඳහා කේතය මතට තට්ටු කළ හැකි හැඟීම්-හොඳ, ප්‍රීතිමත් මුහුණ ස්ටිකරයක් නොවේ. "use strict"ප්‍රායෝගිකත්වය සමඟ , බ්‍රව්සරය හදිසියේම අහඹු ස්ථානවල ව්‍යතිරේකයන් විසි කරනු ඇත, මන්ද එම ස්ථානයේ ඔබ පෙරනිමි / ලිහිල් ජාවාස්ක්‍රිප්ට් සතුටින් ඉඩ දෙන නමුත් දැඩි ජාවාස්ක්‍රිප්ට් පිළිකුල් කරන දෙයක් කරන නිසාය! ඔබේ කේතයේ කලාතුරකින් භාවිතා කරන ඇමතුම් වල සැඟවී ඇති දැඩි උල්ලං lations නයන් ඔබට තිබිය හැකි අතර එය ව්‍යතිරේකයක් වන්නේ ඒවා ක්‍රියාත්මක වන විට පමණි - කියන්න, ඔබේ ගෙවන පාරිභෝගිකයින් භාවිතා කරන නිෂ්පාදන පරිසරය තුළ!

ඔබ "use strict"ඇදවැටීමට යන්නේ නම්, විස්තීර්ණ ඒකක පරීක්ෂණ සහ දැඩි ලෙස වින්‍යාසගත කර ඇති JSHint ගොඩනැගීමේ කාර්යය සමඟ අයදුම් කිරීම හොඳ අදහසකි, එමඟින් ඔබේ මොඩියුලයේ අඳුරු කොනක් නොමැති බවට ඔබට යම් විශ්වාසයක් ලැබෙනු ඇත. මම දැඩි ප්‍රකාරය සක්‍රිය කර ඇත. නැතහොත්, හේයි, මෙන්න තවත් විකල්පයක්: "use strict"ඔබේ උරුම කේතයට කිසිවක් එකතු නොකරන්න, එය අවංකවම ඒ ආකාරයෙන් ආරක්ෂිතයි. තෙවන පාර්ශවීය මොඩියුල මෙන් ඔබට අයිති නැති හෝ නඩත්තු නොකරන මොඩියුලවලට නිශ්චිතවම එකතු "use strict"නොකරන්න.

මම හිතන්නේ එය මාරාන්තික කූඩු සතෙකු "use strict"වුවද හොඳ දේවල් විය හැකි නමුත් ඔබ එය නිවැරදිව කළ යුතුය. දැඩි ලෙස කටයුතු කිරීමට හොඳම කාලය වන්නේ ඔබේ ව්‍යාපෘතිය ග්‍රීන්ෆීල්ඩ් වන අතර ඔබ මුල සිටම ආරම්භ කිරීමයි. මානකරණ JSHint/JSLintඔබගේ කණ්ඩායම ආමාශය හැකි ලෙස සියලු අනතුරු ඇඟවීම් හා විකල්ප සමග දැඩි ලෙස ඉහළ නැංවීම හේතුවෙන්, හොඳ ගොඩ නැඟීමට / පරීක්ෂණ / අණසක පැතිරීමට පද්ධතිය ඩු jour ලැබීම වැනි වංචා Grunt+Karma+Chai, සහ එකම එකල උන් ලෙස ඔබේ සියලු නව මොඩියුල සනිටුහන් ආරම්භ "use strict". බොහෝ වැරදි සහ අනතුරු ඇඟවීම් සුව කිරීමට සූදානම්ව සිටින්න. JSHint/JSLintකිසියම් උල්ලං .නයක් ඇති වුවහොත් ගොඩනැගීම FAIL වෙත වින්‍යාස කිරීමෙන් සියලු දෙනා ගුරුත්වාකර්ෂණය තේරුම් ගෙන ඇති බවට වග බලා ගන්න .

මම සම්මත කරන විට මගේ ව්‍යාපෘතිය ග්‍රීන්ෆීල්ඩ් ව්‍යාපෘතියක් නොවීය "use strict". එහි "use strict"ප්‍රති As ලයක් වශයෙන්, මගේ මොඩියුලවලින් අඩක් මා සතුව නොමැති නිසා මගේ IDE රතු ලකුණු වලින් පිරී ඇති අතර JSHint ඒ ගැන පැමිණිලි කරයි. අනාගතයේදී මා කළ යුත්තේ කුමක්ද යන්න පිළිබඳව මට මතක් කිරීමකි. මගේ ඉලක්කය වන්නේ මගේ නැතිවූ "use strict"ප්‍රකාශ සියල්ල නිසා රතු ලකුණු රහිත වීමයි , නමුත් එය දැන් වසර ගණනාවකි.


24
මෙම ත්‍රෙඩ් එකේ ඩෙව්ස් ඇයි “දැඩි ලෙස භාවිතා කිරීම” ගැන එතරම් උනන්දුවක් නොදක්වන්නේ ?? එය යහපත උදෙසා ජාවාස්ක්‍රිප්ට් වෙනත් ආකාරයකින් වැඩ කිරීමේදී අතිරික්තයක් දක්වයි ! කෝන් ෆ්ලේක්ස් හි සීනි වැනි කේතය මත එය ඉසිය යුතු ය. නොමැත! නරක! "දැඩි ලෙස භාවිතා කරන්න" පරිස්සමින් භාවිතා කළ යුතුය, වඩාත් සුදුසු වන්නේ ඔබ පාලනය කරන කේතයේ පමණක් වන අතර එය සියලු ප්‍රධාන බ්‍රව්සර් වලට එරෙහිව සමත් වන සහ සියලු කේත මාර්ග ක්‍රියාත්මක කරන ඒකක පරීක්ෂණ ඇත. ඔබට පරීක්ෂණ තිබේද? හරි, "තදින් භාවිතා කිරීම" ඔබට හොඳයි, ඔබම තට්ටු කරන්න.
ඩී වොල්ඩ්රිච්

57
ඔව්. නිසැකවම "දැඩි ලෙස භාවිතා කිරීම" මගින් කලින් කැඩී නැති වලංගු ජාවාස්ක්‍රිප්ට් බිඳ දැමිය හැකිය. නමුත් කේතය කලින් කැඩී නොතිබීම කේතය නිවැරදි වීම හා එය කළ යුතු දේ කිරීම හා සමාන නොවේ. සාමාන්‍යයෙන් ප්‍රකාශයට පත් නොකළ විචල්‍යයන් යොමු කිරීම යතුරු ලියනයක සං sign ා කරයි. ආදිය දැඩි ලෙස භාවිතා කිරීමෙන් ඔබට මෙවැනි දෝෂ හඳුනා ගැනීමට ඉඩ සලසයි, ඔබ නිෂ්පාදන කේතය නැව්ගත කිරීමට පෙර බලාපොරොත්තු වන්න.
ජොස්ටයින් ක්ජොනිග්සන්

5
... හෝ ඔබේ කේතය හරහා අවසන් වරට කොටසක් ලෙස "තදින් භාවිතා කරන්න" යොදන්න, පැහැදිලිව පෙනෙන සියලු ගැටලු නිරාකරණය කරන්න, කම්පනය කරන්න, "ඇති තරම් හොඳයි" යැයි පවසන්න, ඉන්පසු එය නිෂ්පාදනය සඳහා රැගෙන යන්න :)
වුල්ෆි ඉනු

13
පුද්ගලිකව, මම කිසි විටෙකත් / ඉතා කලාතුරකින් පවතින කේතයට එකතු නොකරමි "use strict";. මුල සිටම මම නව කේත ලිවීමේදී සෑම විටම පාහේ එය භාවිතා කරමි
මාටින්

3
ඔබ දැනටමත් JSLint භාවිතා කරන්නේ නම්, “දැඩි ලෙස භාවිතා කිරීම” නිසා බොහෝ දේ බිඳ වැටෙනු ඇත.
ජොනතන් කාස්ට්

179

භාවිතා කිරීම 'use strict';හදිසියේම ඔබේ කේතය වඩා හොඳ නොකරයි.

මෙම JavaScript දැඩි මාදිලිය තුළ විශේෂාංගයක් වන සම්මතයන් 5 . ඔබගේ ස්ක්‍රිප්ටයේ / ශ්‍රිතයේ ඉහළින් මෙය ප්‍රකාශ කිරීමෙන් ඔබට දැඩි ප්‍රකාරය සක්‍රිය කළ හැකිය.

'use strict';

ජාවාස්ක්‍රිප්ට් එන්ජිමක් මෙම නියෝගය දුටු විට , එය කේතය විශේෂ ආකාරයකින් අර්ථ නිරූපණය කිරීමට පටන් ගනී. මෙම මාදිලියේදී, විභව දෝෂ ලෙස අවසන් විය හැකි ඇතැම් කේතීකරණ භාවිතයන් අනාවරණය වූ විට දෝෂ මතු වේ (මෙය දැඩි මාදිලිය පිටුපස ඇති හේතුවයි).

මෙම උදාහරණය සලකා බලන්න:

var a = 365;
var b = 030;

සංඛ්‍යාත්මක සාහිත්‍යය පෙළගැස්වීමේ ඔවුන්ගේ උමතුව තුළ, සංවර්ධකයා නොදැනුවත්වම bඅෂ්ටක වචනයක් සමඟ විචල්‍යය ආරම්භ කර ඇත . දැඩි නොවන මාදිලිය මෙය අගය සහිත සංඛ්‍යාත්මක වචනාර්ථයක් ලෙස අර්ථ දක්වනු ඇත 24(10 වන පදනමේ). කෙසේ වෙතත්, දැඩි මාදිලිය දෝෂයක් ඇති කරයි.

දැඩි මාදිලියේ විශේෂතා පිළිබඳ පරිපූර්ණ නොවන ලැයිස්තුවක් සඳහා, බලන්න මෙම පිළිතුර .


මා භාවිතා කළ යුත්තේ කොතැනද? 'use strict'; ?

  • මගේ නව ජාවාස්ක්‍රිප්ට් යෙදුමේ: නියත වශයෙන්ම! ඔබ ඔබේ කේතය සමඟ මෝඩ දෙයක් කරන විට දැඩි ප්‍රකාරය විස්ල්බ්ලොවර් ලෙස භාවිතා කළ හැකිය.

  • මගේ දැනට පවතින ජාවාස්ක්‍රිප්ට් කේතයේ: බොහෝ විට නැත! ඔබගේ පවතින ජාවාස්ක්‍රිප්ට් කේතයට දැඩි ප්‍රකාරයේදී තහනම් ප්‍රකාශ තිබේ නම්, යෙදුම සරලවම කැඩී යනු ඇත. ඔබට දැඩි මාදිලියක් අවශ්‍ය නම්, ඔබගේ පවතින කේතය නිදොස් කොට නිවැරදි කිරීමට ඔබ සූදානම් විය යුතුය. භාවිතා කිරීම 'use strict';හදිසියේම ඔබේ කේතය වඩා හොඳ නොකරන්නේ මේ නිසාය .


මම දැඩි මාදිලිය භාවිතා කරන්නේ කෙසේද?

  1. ඇතුල් කරන්න a 'use strict';ඔබගේ ස්ක්‍රිප්ටයට ඉහළින් ප්‍රකාශයක් :

    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....

    ගොනුවේ ඇති සියල්ල සැලකිල්ලට ගන්න myscript.js දැඩි ආකාරයෙන් අර්ථ නිරූපණය වන .

  2. නැතහොත්, a ඇතුල් කරන්න 'use strict'; ඔබේ ක්‍රියාකාරී ශරීරය මත ප්‍රකාශයක් :

    function doSomething() {
        'use strict';
        ...
    }

    ශබ්දකෝෂයේ විෂය පථයේ ඇති සෑම දෙයක්ම doSomethingදැඩි ආකාරයකින් අර්ථ නිරූපණය කෙරේ. ශබ්දකෝෂ විෂය පථය යන වචනය මෙහි වැදගත් වේ. නිදසුනක් ලෙස, ඔබේ දැඩි කේතය පුස්තකාලයක ශ්‍රිතයක් දැඩි ලෙස නොකියන්නේ නම් , ඔබේ කේතය පමණක් ක්‍රියාත්මක වන්නේ දැඩි ප්‍රකාරයේදී මිස කැඳවූ ශ්‍රිතයෙන් නොවේ. වඩා හොඳ පැහැදිලි කිරීමක් සඳහා මෙම පිළිතුර බලන්න .


දැඩි ආකාරයෙන් තහනම් කර ඇති දේවල් මොනවාද?

මට ලස්සන ලිපියක් හමු වියදැඩි ආකාරයකින් තහනම් කර ඇති කරුණු කිහිපයක් විස්තර (මෙය සුවිශේෂී ලැයිස්තුවක් නොවන බව සලකන්න):

විෂය පථය

Ically තිහාසිකව, ජාවාස්ක්‍රිප්ට් කාර්යයන් විෂය පථයට ලක් කරන්නේ කෙසේද යන්න පිළිබඳව ව්‍යාකූල වී ඇත. සමහර විට ඒවා සංඛ්‍යානමය වශයෙන් විෂය පථයට අයත් බව පෙනේ, නමුත් සමහර ලක්ෂණ ඔවුන් ගතිකව විෂය පථයට සමාන ලෙස හැසිරීමට හේතු වේ. මෙය අවුල් සහගත වන අතර වැඩසටහන් කියවීමට හා තේරුම් ගැනීමට අපහසු වේ. වරදවා වටහා ගැනීම දෝෂ ඇති කරයි. එය කාර්ය සාධනය සඳහා ද ගැටලුවකි. ස්ථිතික විෂය පථය මඟින් විචල්‍ය බන්ධන සම්පාදනය කරන වේලාවේදී සිදුවීමට ඉඩ දෙනු ඇත, නමුත් ගතික විෂය පථයේ අවශ්‍යතාවයෙන් අදහස් වන්නේ බන්ධනය ධාවන කාලයට කල් දැමිය යුතු අතර එය සැලකිය යුතු කාර්ය සාධන ද .ුවමක් සමඟ පැමිණේ.

දැඩි ප්‍රකාරයට සියලු විචල්‍ය බන්ධන සංඛ්‍යාත්මකව සිදු කිරීම අවශ්‍ය වේ. ඒ කියන්නේ මීට පෙර ගතික බන්ධනය අවශ්‍ය වූ අංග ඉවත් කිරීම හෝ වෙනස් කිරීම කළ යුතුය. නිශ්චිතවම, විත් ප්‍රකාශය තුරන් කර ඇති අතර, එවාල් ශ්‍රිතයට එහි අමතන්නාගේ පරිසරය හානි කිරීමට ඇති හැකියාව දැඩි ලෙස සීමා කර ඇත.

දැඩි කේතයේ එක් වාසියක් නම්, යූඅයි සම්පීඩකය වැනි මෙවලම් සැකසීමේදී වඩා හොඳ කාර්යයක් කළ හැකි වීමයි.

ගම්‍ය වූ ගෝලීය විචල්‍යයන්

ජාවාස්ක්‍රිප්ට් ගෝලීය විචල්‍යයන් ඇඟවුම් කර ඇත. ඔබ විචල්‍යයක් පැහැදිලිව ප්‍රකාශ නොකරන්නේ නම්, ගෝලීය විචල්‍යයක් ඔබ වෙනුවෙන් ව්‍යංගයෙන් ප්‍රකාශයට පත් කෙරේ. මෙය ආරම්භකයින්ට ඔවුන්ගේ මූලික ගෙදර දොරේ වැඩ කටයුතු අතපසු කළ හැකි බැවින් වැඩසටහන්කරණය පහසු කරයි. නමුත් එය විශාල වැඩසටහන් කළමනාකරණය කිරීම වඩා දුෂ්කර කරවන අතර එය විශ්වසනීයත්වය සැලකිය යුතු ලෙස පිරිහීමට ලක් කරයි. එබැවින් දැඩි ප්‍රකාරයේදී, ගම්‍ය වන ගෝලීය විචල්‍යයන් තවදුරටත් නිර්මාණය නොවේ. ඔබේ සියලු විචල්‍යයන් ඔබ පැහැදිලිව ප්‍රකාශ කළ යුතුය.

ගෝලීය කාන්දුව

this ගෝලීය වස්තුවට බැඳීමට හේතු විය හැකි අවස්ථා ගණනාවක් තිබේ . නිදසුනක් ලෙස, newඉදිකිරීම්කරුවෙකුගේ ශ්‍රිතයක් ඇමතීමේදී උපසර්ගය ලබා දීමට ඔබ අමතක කළහොත් , ඉදිකිරීම්කරුගේ thisඅනපේක්ෂිත ලෙස ගෝලීය වස්තුවට බැඳී ඇත, එබැවින් නව වස්තුවක් ආරම්භ කිරීම වෙනුවට එය නිහ ly ව ගෝලීය විචල්‍යයන් සමඟ පටලවා ගනු ඇත. මෙම අවස්ථා වලදී, දැඩි මාදිලිය ඒ වෙනුවට බැඳී thisඇතundefined , එමඟින් ඉදිකිරීම්කරු විසින් ව්‍යතිරේකයක් විසි කිරීමට හේතු වන අතර එමඟින් දෝෂය ඉක්මනින් හඳුනා ගැනීමට ඉඩ ලබා දේ.

Is ෝෂාකාරී අසමත් වීම

ජාවාස්ක්‍රිප්ට් හි සෑම විටම කියවීමට-පමණක් ගුණාංග ඇත, නමුත් ඔබට ඊඑස් 5 වන තෙක් ඒවා තනිවම නිර්මාණය කළ නොහැක Object.createProperty ක්‍රියාකාරීත්වය එම හැකියාව හෙළි කරන . ඔබ කියවීමට පමණක් ඇති දේපලකට වටිනාකමක් ලබා දීමට උත්සාහ කළහොත් එය නිහ .ව අසාර්ථක වනු ඇත. පැවරුම දේපල වටිනාකම වෙනස් නොකරනු ඇත, නමුත් ඔබේ වැඩසටහන එහි ඇති ආකාරයටම ඉදිරියට යනු ඇත. මෙය අඛණ්ඩතාවයේ උපද්‍රවයක් වන අතර එමඟින් වැඩසටහන් නොගැලපෙන තත්වයකට පත්වේ. දැඩි ප්‍රකාරයේදී, කියවීමට පමණක් ඇති දේපලක් වෙනස් කිරීමට උත්සාහ කිරීම ව්‍යතිරේකයක් වනු ඇත.

ඔක්ටල්

වචන ප්‍රමාණය 3 ට වඩා වැඩි වූ යන්ත්‍රවල යන්ත්‍ර මට්ටමේ ක්‍රමලේඛන සිදු කරන විට අංකවල අෂ්ටක (හෝ පාදක 8) නිරූපණය අතිශයින් ප්‍රයෝජනවත් විය. වචන විශාලත්වය බිට් 60 ක් වූ සීඩීසී 6600 මේන්ෆ්‍රේම් සමඟ වැඩ කිරීමේදී ඔබට අෂ්ටක අවශ්‍ය විය. ඔබට අෂ්ටකය කියවිය හැකි නම්, ඔබට වචනයක් ඉලක්කම් 20 ක් ලෙස බැලිය හැකිය. ඉලක්කම් දෙකක් දෘෂ්ටි කේතය නිරූපණය කළ අතර එක් ඉලක්කම් ලේඛණ 8 න් එකක් හඳුනා ගත්තේය. යන්ත්‍ර කේතවල සිට ඉහළ මට්ටමේ භාෂාවලට මන්දගාමීව මාරුවීමේදී, ක්‍රමලේඛන භාෂාවල අෂ්ටක ආකෘති සැපයීම ප්‍රයෝජනවත් යැයි සිතේ.

සී හි දී, අෂ්ටකතාවයේ අතිශය අවාසනාවන්ත නිරූපණයක් තෝරා ගන්නා ලදී: ප්‍රමුඛ ශුන්‍යය. එබැවින් C හි, 010064, 100 නොව 100 වන අතර 08එය දෝෂයකි, 8 නොවේ. ඊටත් වඩා අවාසනාවකට මෙන්, මෙම ඇනක්‍රොනිස්වාදය ජාවාස්ක්‍රිප්ට් ඇතුළු සියලුම නවීන භාෂාවලට පිටපත් කර ඇත, එහිදී එය දෝෂ නිර්මාණය කිරීමට පමණක් භාවිතා කරයි. එයට වෙනත් අරමුණක් නැත. එබැවින් දැඩි ප්‍රකාරයේදී, අෂ්ටක ආකෘති තවදුරටත් ඉඩ නොදේ.

සහ සෙටෙරා

ව්‍යාජ අරාව ES5 හි තව ටිකක් අරාව-සමාන වේ. දැඩි ප්රකාරයේදී, එය එහි calleeසහ caller ගුණාංග නැති කරයි. මෙය argumentsබොහෝ රහස්‍ය සන්දර්භයන් අත් නොහරිමින් ඔබේ විශ්වාසනීය නොවන කේතයට යැවීමට ඉඩ සලසයි . එසේම, argumentsකාර්යයන්හි දේපල ඉවත් කරනු ලැබේ.

දැඩි ප්‍රකාරයේදී, ශ්‍රිතයක අනුපිටපත් යතුරු සින්ටැක්ස් දෝෂයක් ඇති කරයි. ශ්‍රිතයකට එකම නමක් සහිත පරාමිති දෙකක් තිබිය නොහැක. ශ්‍රිතයකට එහි පරාමිතීන්ගෙන් එකකට සමාන විචල්‍යයක් තිබිය නොහැක. ශ්‍රිතයකට deleteඑහි විචල්‍යයන් තිබිය නොහැක . deleteවින්‍යාසගත කළ නොහැකි දේපලකට උත්සාහ කිරීම දැන් ව්‍යතිරේකයකි. ප්‍රාථමික අගයන් ව්‍යංගයෙන් ඔතා නැත.


අනාගත ජාවාස්ක්‍රිප්ට් අනුවාද සඳහා වෙන් කළ වචන

ECMAScript 5 වෙන් කළ වචන ලැයිස්තුවක් එක් කරයි. ඔබ ඒවා විචල්‍ය හෝ තර්ක ලෙස භාවිතා කරන්නේ නම්, දැඩි ප්‍රකාරය දෝෂයක් ඇති කරයි. වෙන් කර ඇති වචන නම්:

implements, interface, let, package, private, protected, public, static, සහyield


වැඩිදුර කීයවීම


2
එය ඉතා හොඳ පැහැදිලි කිරීමකි. කෙසේ වෙතත්, මට එක් සැකයක් තිබේ, කෝණික js වැනි වෙනත් ජාවා ස්ක්‍රිප්ට් පුස්තකාල සමඟ ඒකාබද්ධව “දැඩි” මාදිලිය භාවිතා කළ හැකිද?
යූවීඑම්

3
V යූවීඑම්: දැඩි මාදිලියේ විධානය බලපාන්නේ ශබ්දකෝෂ විෂය පථයට පමණි. එනම් එය ප්‍රකාශයට පත් කරන ලද ගොනුව / ශ්‍රිතය පමණි. ඔබට විධානයක් නොමැති වෙනත් ගොනුවක් / ශ්‍රිතයක් තිබේ නම් 'use strict', ඒවා දැඩි ප්‍රකාරයේදී ක්‍රියාත්මක වන ශ්‍රිතයකින් ඇමතූ විට පවා ඒවා දැඩි නොවන ආකාරයෙන් ක්‍රියාත්මක වේ. පැහැදිලි කිරීමක් සඳහා මෙම අස්නවර් බලන්න .
sampathsris

මෙය සම්පූර්ණයෙන්ම නිවැරදි නොවේ. 'තදින් භාවිතා කිරීම' කේතය ක්‍රියාත්මක කරන ආකාරය වෙනස් කරයි.
සයිබර් එඩ්

3
දෙවනුව බැලූ විට, ඔබ හරි. මම හිතුවේ ඔබ අදහස් කළේ එය ව්‍යතිරේකයන් පමණක් බවයි, නමුත් කේතය ක්‍රියා කරන ආකාරය වෙනස් කළේ නැත (වෙනස් කිරීම වැනි this). දැන් මට පෙනෙන්නේ ඔබ වෙනත් කාර්යයන් ඇමතීමට යොමු වූ බවයි.
සයිබර් එඩ්

3
අෂ්ටක ප්‍රයෝජනවත් වන අවස්ථා තිබේ. ඒ සඳහා සී වාක්‍ය ඛණ්ඩය භයානක ය, නමුත් භාෂා නව අෂ්ටක වාක්‍ය ඛණ්ඩයක් එක් කරනු දැකීමට මා කැමති වනු ඇත. ඇත්ත වශයෙන්ම, ජාවාස්ක්‍රිප්ට් ප්‍රමුඛ ශුන්‍ය ආකෘතියට සහය දැක්වීම මෝඩකමක් විය.
supercat

138

සෑම මාදිලියක්ම දැඩි මාදිලියක් භාවිතා කිරීම ආරම්භ කරන ලෙස මම තරයේ නිර්දේශ කරමි. ඔබගේ කේතයේ ඇති බව අප නොදැන සිටි දෝෂ වලින් අපව ගලවා ගැනීමට දැඩි මාදිලිය නීත්‍යානුකූලව උපකාරී වනු ඇති බවට අවශ්‍ය බ්‍රව්සර් ඕනෑ තරම් තිබේ.

පෙනෙන විදිහට, ආරම්භක අවධියේදී අපට මීට පෙර කවදාවත් හමු නොවූ දෝෂ ඇති වේ. සම්පූර්ණ ප්‍රතිලාභය ලබා ගැනීම සඳහා, අප සෑම දෙයක්ම අල්ලාගෙන ඇති බවට තහවුරු කර ගැනීම සඳහා දැඩි ක්‍රමයට මාරුවීමෙන් පසු නිසි පරීක්ෂණයක් කළ යුතුය. නිසැකවම අපි use strictඅපගේ කේතය තුළට විසි නොකර දෝෂ නොමැති බව උපකල්පනය කරමු. ඒ නිසා අවුල් සහගත කාරණය නම් වඩා හොඳ කේතයක් ලිවීම සඳහා මෙම ඇදහිය නොහැකි තරම් ප්‍රයෝජනවත් භාෂා අංගයක් භාවිතා කිරීමට පටන් ගැනීමයි.

උදාහරණයක් වශයෙන්,

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

ජේඑස්ලින්ට් යනු ඩග්ලස් ක්‍රොක්ෆර්ඩ් විසින් ලියන ලද නිදොස්කරණයකි. ඔබගේ ස්ක්‍රිප්ටයේ සරලව අලවන්න, එය ඔබගේ කේතයේ ඇති සැලකිය යුතු ගැටළු සහ දෝෂ සඳහා ඉක්මනින් පරිලෝකනය කරයි.


6
Am ජේමිහට්බර්: කරුණාකර මෙම සබැඳියට පිවිසෙන්න caniuse.com/use-strict AND kangax.github.io/es5-compat-table . එය සියලුම බ්‍රව්සර සඳහා නිශ්චිත අදහසක් ලබා දෙනු ඇත.
පන්ක්

95

අනෙක් පිළිතුරු වලට අනුකූලව තරමක් දුරට පදනම් වූ පිළිතුරක් දීමට මම කැමතියි. මම වඩාත් ජනප්‍රිය පිළිතුර සංස්කරණය කිරීමට බලාපොරොත්තු වූ නමුත් එය අසාර්ථක විය. මම එය හැකි තරම් පුළුල් හා සම්පූර්ණ කිරීමට උත්සාහ කළෙමි.

වැඩි විස්තර සඳහා ඔබට MDN ප්‍රලේඛනය වෙත යොමු විය හැකිය .

"use strict" ECMAScript 5 හි හඳුන්වා දුන් නියෝගයක්.

විධානයන් ප්‍රකාශයන්ට සමාන නමුත් වෙනස් ය.

  • use strictප්‍රධාන වචන අඩංගු නොවේ: විධානය සරල ප්‍රකාශන ප්‍රකාශයක් වන අතර එය විශේෂ වචන වලින් සමන්විත වේ (තනි හෝ ද්විත්ව උපුටා දැක්වීම් වලින්). ECMAScript 5 ක්‍රියාත්මක නොකරන ජාවාස්ක්‍රිප්ට් එන්ජින්, අතුරු ආබාධ නොමැතිව ප්‍රකාශන ප්‍රකාශයක් පමණක් බලන්න. ECMAScript ප්‍රමිතීන්ගේ අනාගත අනුවාදයන් useසැබෑ යතුරු වචනයක් ලෙස හඳුන්වා දෙනු ඇතැයි අපේක්ෂා කෙරේ ; එමගින් උපුටා දැක්වීම් යල්පැන යනු ඇත.
  • use strictභාවිතා කළ හැක්කේ ස්ක්‍රිප්ට් එකක හෝ ශ්‍රිතයක ආරම්භයේ දී පමණි, එනම් එය අනෙක් සෑම (සත්‍ය) ප්‍රකාශයකට පෙර තිබිය යුතුය. එය ශ්‍රිත පිටපතක පළමු උපදෙස් විය යුතු නැත: එයට පෙර වචන ප්‍රකාශන වලින් සමන්විත වෙනත් ප්‍රකාශන ප්‍රකාශනයන්ගෙන් පෙර විය හැකිය (සහ ජාවාස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීම මඟින් ඒවා ක්‍රියාත්මක කිරීමේ නිශ්චිත විධානයන් ලෙස සැලකිය හැකිය). පළමු සත්‍ය ප්‍රකාශයක් (ස්ක්‍රිප්ට් එකක හෝ ශ්‍රිතයක) අනුගමනය කරන නූල් වචනාර්ථ ප්‍රකාශයන් සරල ප්‍රකාශන ප්‍රකාශ වේ. පරිවර්තකයන් ඒවා විධානයන් ලෙස අර්ථ නිරූපණය නොකළ යුතු අතර ඒවාට කිසිදු බලපෑමක් නැත.

මෙම use strictනියෝගය (තිර රචනය හෝ උත්සවයකට දී) පහත දැක්වෙන කේතය දැඩි කේතය බව පෙන්නුම් කරයි. ස්ක්‍රිප්ටයේ ඉහළම මට්ටමේ ඇති කේතය (ශ්‍රිතයක නොමැති කේතය) ස්ක්‍රිප්ටයේ විධානයක් අඩංගු වන විට දැඩි කේතයක් ලෙස සැලකේ use strict. ශ්‍රිතය දැඩි කේතයකින් අර්ථ දක්වා ඇති විට හෝ ශ්‍රිතයේ විධානයක් අඩංගු වූ විට ශ්‍රිතයක අන්තර්ගතය දැඩි කේතයක් ලෙස සැලකේ use strict. eval()ක්‍රමයකට සම්මත කරන ලද කේතය දැඩි කේතයකින් eval()කැඳවූ විට හෝ use strictවිධානය අඩංගු වූ විට එය දැඩි කේතයක් ලෙස සැලකේ .

ECMAScript 5 හි දැඩි මාදිලිය ජාවාස්ක්‍රිප්ට් භාෂාවේ සීමිත උප කුලකයක් වන අතර එමඟින් භාෂාවේ අදාළ its නතාවයන් ඉවත් කරන අතර වඩාත් දැඩි දෝෂ පරීක්ෂා කිරීම සහ ඉහළ ආරක්ෂාව ඇතුළත් වේ. පහත දැක්වෙන්නේ දැඩි මාදිලිය සහ සාමාන්‍ය මාදිලිය අතර ඇති වෙනස්කම් (පළමු තුන විශේෂයෙන් වැදගත් වේ):

  • ඔබට withදැඩි ප්‍රකාරයේදී -statement භාවිතා කළ නොහැක .
  • දැඩි ප්‍රකාරයේදී සියලුම විචල්‍යයන් ප්‍රකාශයට පත් කළ යුතුය: ඔබ විචල්‍යය, ශ්‍රිතය, ක්‍රියාකාරී පරාමිතිය, ඇල්ලීමේ වගන්තිය හෝ ගෝලීය දේපල ලෙස ප්‍රකාශයට පත් නොකළ හඳුනාගැනුමකට අගයක් ලබා දෙන්නේ නම් Object, එවිට ඔබට ලැබෙනුයේ a ReferenceError. සාමාන්ය ක්රමය තුළ හඳුනාගැනීමේ නිසැකයෙන්ම (ගෝලීය ක දේපල ලෙස ගෝලීය විචල්ය ලෙස ප්රකාශයට පත් කරයි Object)
  • දැඩි ප්‍රකාරයේදී මූල පදයට ශ්‍රිත ලෙස ආයාචනා කරන ලද ශ්‍රිතවල thisඅගය undefinedඇත (ක්‍රම ලෙස නොවේ). (සාමාන්‍ය ප්‍රකාරයේදී thisසෑම විටම ගෝලීය වෙත යොමු වේ Object). ක්‍රියාත්මක කිරීම දැඩි ප්‍රකාරයට සහය දක්වන්නේ දැයි පරීක්ෂා කිරීමට මෙම වෙනස භාවිතා කළ හැකිය:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • ශ්‍රිතයක් දැඩි ප්‍රකාරයකින් call()හෝ ආයාචනා කරන විට apply, thisහරියටම call()හෝ apply()ආයාචනයේ පළමු තර්කයේ වටිනාකම වේ . (සාමාන්ය භාවිතය තුළ nullහා undefinedගෝලීය විසින් විස්ථාපනය Objectවස්තූන් සහ නොවන අගයන්, වස්තූන් හෙලනු ලබයි.)

  • TypeErrorවිස්තාරණ නොවන වස්තුවක් සඳහා කියවීමට පමණක් ගුණාංග පැවරීමට හෝ නව ගුණාංග නිර්වචනය කිරීමට උත්සාහ කරන විට දැඩි ප්‍රකාරයේදී ඔබට ලැබෙනු ඇත . (සාමාන්‍ය ප්‍රකාරයේදී දෙකම වැරදි පණිවිඩයකින් තොරව අසමත් වේ.)

  • දැඩි ප්‍රකාරයේදී, කේතය සම්මත කිරීමේදී eval(), ඔබට අමතන්නාගේ විෂය පථයේ විචල්‍යයන් හෝ ක්‍රියාකාරකම් ප්‍රකාශ කිරීමට හෝ අර්ථ දැක්වීමට නොහැකිය (ඔබට එය සාමාන්‍ය ප්‍රකාරයේදී කළ හැකි පරිදි). ඒ වෙනුවට, නව විෂය පථයක් නිර්මාණය වන eval()අතර විචල්‍යයන් සහ කාර්යයන් එම විෂය පථය තුළ පවතී. eval()ක්‍රියාත්මක කිරීම අවසන් වූ පසු එම විෂය පථය විනාශ වේ.
  • දැඩි ප්‍රකාරයේදී ශ්‍රිතයක තර්ක-වස්තුවෙහි අගයන්හි ස්ථිතික පිටපතක් අඩංගු වන අතර ඒවා එම ශ්‍රිතයට ලබා දේ. සාමාන්‍ය ප්‍රකාරයේදී තර්ක-වස්තුවට තරමක් “ඉන්ද්‍රජාලික” හැසිරීමක් ඇත: අරාවේ මූලද්‍රව්‍ය සහ නම් කරන ලද ශ්‍රිත පරාමිතීන් එකම අගයක් දක්වයි.
  • දැඩි ප්‍රකාරයේදී ක්‍රියාකරු සුදුසුකම් නොලත් හඳුනාගැනීමක් (විචල්‍ය, ශ්‍රිත හෝ ක්‍රියාකාරී පරාමිතියක්) අනුගමනය කරන SyntaxErrorවිට ඔබට ලැබෙනු ඇත delete. සාමාන්‍ය ප්‍රකාරයේදී deleteප්‍රකාශනය කිසිවක් නොකරන අතර එය ඇගයීමට ලක් කෙරේ false.
  • TypeErrorවින්‍යාසගත කළ නොහැකි දේපලක් මකා දැමීමට උත්සාහ කරන විට දැඩි ප්‍රකාරයේදී ඔබට ලැබෙනු ඇත . (සාමාන්‍ය ප්‍රකාරයේදී උත්සාහය අසාර්ථක වන අතර deleteප්‍රකාශනය ඇගයීමට ලක් කෙරේ false).
  • දැඩි ප්‍රකාරයේදී ඔබ වස්තුවක් සඳහා එකම නමක් සහිත ගුණාංග කිහිපයක් අර්ථ දැක්වීමට උත්සාහ කරන විට එය සින්ටැක්ටිකල් දෝෂයක් ලෙස සැලකේ. (සාමාන්‍ය ප්‍රකාරයේදී දෝෂයක් නොමැත.)
  • දැඩි ප්‍රකාරයේදී ශ්‍රිත ප්‍රකාශනයකට එකම නමක් සහිත පරාමිතීන් ඇති විට එය සින්ටැක්ටිකල් දෝෂයක් ලෙස සැලකේ. (සාමාන්‍ය ප්‍රකාරයේදී දෝෂයක් නොමැත.)
  • දැඩි ප්‍රකාරයේදී අෂ්ටක වචනාර්ථයට අවසර නැත (මේවා ආරම්භ වන්නේ වචනානුසාරයෙන් ය 0x. (සාමාන්‍ය ක්‍රමයේදී සමහර ක්‍රියාත්මක කිරීම් මඟින් අෂ්ටක සාක්ෂරයන්ට ඉඩ ලබා දේ.)
  • දැඩි ප්‍රකාරයේදී හඳුනාගැනීම් evalසහ argumentsඒවා ප්‍රධාන වචන ලෙස සලකනු ලැබේ. ඔබට ඒවායේ වටිනාකම වෙනස් කළ නොහැක, ඒවාට අගයක් පැවරිය නොහැක, තවද ඔබට ඒවා විචල්‍යයන්, කාර්යයන්, ක්‍රියාකාරී පරාමිතීන් හෝ ඇල්ලීමේ කොටසක හඳුනාගැනීම් සඳහා නම් ලෙස භාවිතා කළ නොහැක.
  • දැඩි ප්‍රකාරයේදී ඇමතුම් තොගය පරීක්ෂා කිරීමට ඇති හැකියාව පිළිබඳ වැඩි සීමාවන් ඇත. arguments.callerහා arguments.calleeඑය හේතු TypeErrorදැඩි මාදිලිය තුළ උත්සවයට. තවද, සමහර ප්‍රකාරක සහ තර්ක ගුණාංග දැඩි ප්‍රකාරයේදී TypeErrorඔබ ඒවා කියවීමට උත්සාහ කරන විට හේතු වේ.

4
"දැඩි ප්‍රකාරයේදී අෂ්ටක සාක්ෂරතාවන්ට අවසර නැත (මේවා 0x වලින් ආරම්භ වන වචනාර්ථයන් වේ ...)" අෂ්ටක සාක්ෂරතාවන් ප්‍රමුඛ පෙළකින් ආරම්භ වේ 0.
ඇලෙක්ස් ගිටෙමියර්

83

මගේ ශත දෙක:

දැඩි මාදිලියේ එක් ඉලක්කයක් වන්නේ ගැටළු නිරාකරණය කිරීම සඳහා ඉඩ දීමයි. ඔබේ වෙබ් පිටුවේ නිහ silent සහ අමුතු හැසිරීමට හේතු විය හැකි යම් යම් වැරදි දේ සිදු වූ විට එය ව්‍යතිරේකය විසි කිරීමෙන් සංවර්ධකයින්ට උපකාරී වේ. අප භාවිතා කරන මොහොතේදී use strict, කේතය මඟින් දෝෂ ඉවත් කරනු ඇති අතර එය කල්තියාම නිවැරදි කිරීමට සංවර්ධකයාට උපකාරී වේ.

භාවිතා කිරීමෙන් පසු මම ඉගෙන ගත් වැදගත් කරුණු කිහිපයක් use strict:

ගෝලීය විචල්‍ය ප්‍රකාශනය වළක්වයි:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

දැන්, මෙම කේතය නිර්මාණය කරයි nameoftree භාවිතයෙන් ප්‍රවේශ විය හැකි ගෝලීය විෂය පථය තුළ වේ window.nameoftree. අපි use strictකේතය ක්‍රියාත්මක කරන විට දෝෂයක් ඇති වේ.

හඳුනා නොගත් යොමු දෝෂය: nameoftree යන්න අර්ථ දක්වා නැත

Sample

ඉවත් කරයි withප්‍රකාශය :

withuglify-js වැනි මෙවලම් භාවිතයෙන් ප්‍රකාශ අවම කළ නොහැක . ඔවුන් ද කරන්නේ නොසලකා හරිනු හා අනාගත JavaScript අනුවාදයකින් ඉවත් කර ඇත.

Sample

අනුපිටපත් වළක්වයි:

අපට අනුපිටපත් දේපළ ඇති විට, එය ව්‍යතිරේකයක් විසි කරයි

හඳුනා නොගත් සින්ටැක්ස් දෝෂය: වස්තු වචනාර්ථයෙන් අනුපිටපත් දත්ත දේපල දැඩි ප්‍රකාරයේදී අවසර නැත

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

තවත් කිහිපයක් ඇති නමුත් ඒ පිළිබඳව මට වැඩි දැනුමක් ලබා ගත යුතුය.


ECMAScript 2015 සමඟ අනුපිටපත් දේපල නම් නැවත අවසර දෙනු ලැබේ! MDN ප්‍රලේඛනය බලන්න .
philmcole

62

ඔබ පසුගිය වසරේ නිකුත් කළ බ්‍රව්සරයක් භාවිතා කරන්නේ නම් එය බොහෝ විට ජාවාස්ක්‍රිප්ට් දැඩි ක්‍රමයට සහය දක්වයි. ECMAScript 5 වර්තමාන ප්‍රමිතිය බවට පත්වීමට පෙර පැරණි බ්‍රව්සර් පමණක් එයට සහාය නොදක්වයි.

විධානය වටා ඇති උපුටා දැක්වීම් මඟින් පැරණි බ්‍රව්සර්වලද කේතය ක්‍රියාත්මක වන බවට වග බලා ගනී (දැඩි මාදිලියේ සින්ටැක්ස් දෝෂයක් ජනනය කරන දේවල් සාමාන්‍යයෙන් එම පැරණි බ්‍රව්සර්වල ඇති ආකාරය හඳුනා ගැනීමට අසීරු ලෙස ස්ක්‍රිප්ට් ක්‍රියා විරහිත වීමට හේතු වේ).


12
එවිට එය කරන්නේ කුමක්ද?
අනීෂ් ගුප්තා

7
... මෙය අර්ධ වශයෙන් ගැළපුම විස්තර කරයි , නමුත් එය ඇත්ත වශයෙන්ම කරන්නේ කුමක්ද යන්න නොවේ.
Courtimas

58

එකතු කරන විට "use strict";, ස්ක්‍රිප්ට් ක්‍රියාත්මක වීමට පෙර පහත දැක්වෙන අවස්ථා සින්ටැක්ස් දෝෂයක් විසි කරයි :

  • අනාගත සම්මතයන් අනුවාද සඳහා ඉඩ සැලසෙන (සඳහා prevision අභිනවයෙන් ඇවිරිණි වචන එක් භාවිතා සම්මතයන් 6 ): implements, interface, let, package, private, protected, public, static, සහ yield.

  • කුට්ටි වල ක්රියාකාරිත්වය ප්රකාශ කිරීම

    if(a<b){ function f(){} }
  • ඔක්ටල් සින්ටැක්ස්

    var n = 023;
  • this ගෝලීය වස්තුව වෙත යොමු කරන්න.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
  • වස්තුවක දේපල නාමයක් සඳහා එකම නම මෙන් දෙගුණයක් ප්‍රකාශ කිරීම

     {a: 1, b: 3, a: 7} 

    ECMAScript 6 ( දෝෂ 1041128 ) හි මෙය තවදුරටත් සිදු නොවේ .

  • එකම නාම ශ්‍රිතයක් සහිත ශ්‍රිත තර්ක දෙකක් ප්‍රකාශ කිරීම

    f(a, b, b){}
  • ප්‍රකාශ නොකළ විචල්‍යයකට අගයක් සැකසීම

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
  • deleteවිචල්ය නාමයක් භාවිතා කිරීමdelete myVariable;

  • භාවිතා evalහෝ argumentsවිචල්ය හෝ කාර්යය තර්කය නම ලෙස

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 

මුලාශ්‍ර:


ECMAScript 2015 සමඟ අනුපිටපත් දේපල නම් නැවත අවසර දෙනු ලැබේ! MDN ප්‍රලේඛනය බලන්න .
philmcole

53

දැඩි ප්‍රකාරය සාමාන්‍ය ජාවාස්ක්‍රිප්ට් අර්ථ නිරූපණයට වෙනස්කම් කිහිපයක් කරයි:

  • සමහර ජාවාස්ක්‍රිප්ට් නිහ silent දෝෂ ඉවත් කර ඒවා දෝෂ විසි කිරීමට වෙනස් කරයි.

  • ජාවාස්ක්‍රිප්ට් එන්ජින් වලට ප්‍රශස්තිකරණය කිරීමට අපහසු වන වැරදි නිවැරදි කරයි.

  • ECMAScript හි අනාගත අනුවාද වල අර්ථ දැක්විය හැකි සමහර සින්ටැක්ස් තහනම් කරයි.

වැඩි විස්තර සඳහා දැඩි ප්‍රකාරය - ජාවාස්ක්‍රිප්ට් බලන්න


52

"දැඩි ලෙස භාවිතා කරන්න"; ක්‍රමලේඛකයා ජාවාස්ක්‍රිප්ට් හි ලිහිල් හෝ නරක ගුණාංග භාවිතා නොකරන රක්ෂණයකි. එය මඟ පෙන්වීමකි, පාලකයෙකු ඔබට සරල රේඛා සෑදීමට උපකාරී වනු ඇත. "දැඩි ලෙස භාවිතා කිරීම" ඔබට "කෙළින්ම කේතීකරණය" කිරීමට උපකාරී වේ.

ඔවුන්ගේ රේඛා කෙළින්ම කිරීමට පාලකයන් භාවිතා නොකිරීමට කැමති අය සාමාන්‍යයෙන් එම පිටුවල කෙළවර වන්නේ අන් අය ඔවුන්ගේ කේතය නිදොස්කරණය කරන ලෙස ඉල්ලා සිටීමෙනි.

මාව විශ්වාස කරන්න. දුර්වල ලෙස සැලසුම් කර ඇති කේතයට සාපේක්ෂව පොදු කාර්ය පිරිවැය නොසැලකිය. වසර ගණනාවක් තිස්සේ ජාවාස්ක්‍රිප්ට් හි ජ්‍යෙෂ් senior සංවර්ධකයෙකු ලෙස කටයුතු කළ ඩග් ක්‍රොක්ෆර්ඩ් මෙහි ඉතා රසවත් තනතුරක් දරයි . පුද්ගලිකව, මම මගේ හොඳ පුරුද්ද අමතක නොකරන බවට වග බලා ගැනීම සඳහා ඔහුගේ වෙබ් අඩවියට නැවත යාමට කැමැත්තෙමි.

නූතන ජාවාස්ක්‍රිප්ට් භාවිතයෙන් සෑම විටම “දැඩි ලෙස භාවිතා කරන්න”; ප්‍රග්මා. ECMA සමූහය "දැඩි" මාදිලිය විකල්පයක් බවට පත් කිරීමට ඇති එකම හේතුව වන්නේ අඩු පළපුරුදු කේත රචකයන්ට ජාවාස්ක්‍රිප්ට් වෙත ප්‍රවේශ වීමට අවසර දීම සහ නව සහ ආරක්ෂිත කේතීකරණ භාවිතයන්ට අනුවර්තනය වීමට කාලය ලබා දීමයි.


66
දැඩි මාදිලිය විකල්පයක් වීමට හේතුව ඔබ ප්‍රකාශ කළ දෙයට කිසිදු සම්බන්ධයක් නැත. සැබෑ හේතුව වන්නේ අනුකූල නොවන පවතින කේතය කඩ නොකිරීමයි .
ඔක්සිජන්

17
ඇත්ත වශයෙන්ම, අඩු පළපුරුද්දක් ඇති කෝඩර්ස් “දැඩි ලෙස භාවිතා කිරීම” සක්‍රීය කළ පළමු අය විය යුතුය ;
ඇන්ටි හාපාල

46

use strictමේ මොහොතේ සිට ඔබගේ සියලු සංවේදී ජාවාස්ක්‍රිප්ට් ලිපිගොනු ඇතුළත් කිරීම වඩා හොඳ ජාවාස්ක්‍රිප්ට් ක්‍රමලේඛකයෙකු වීමට කුඩා ක්‍රමයක් වන අතර අහඹු විචල්‍යයන් ගෝලීය වීම වළක්වා ගත හැකි අතර නිහ .ව දේවල් වෙනස් වේ.


42

W3 පාසල් වලින් උපුටා ගැනීම :

“දැඩි ලෙස භාවිතා කරන්න” විධානය

ජාවාස්ක්‍රිප්ට් 1.8.5 (ECMAScript අනුවාදය 5) හි “දැඩි ලෙස භාවිතා කරන්න” විධානය අලුත් ය.

එය ප්‍රකාශයක් නොව, ජාවාස්ක්‍රිප්ට් හි පෙර අනුවාදයන් විසින් නොසලකා හරින ලද වචනාර්ථ ප්‍රකාශනයකි.

“දැඩි ලෙස භාවිතා කිරීම” හි අරමුණ වන්නේ කේතය “දැඩි ප්‍රකාරයේදී” ක්‍රියාත්මක කළ යුතු බවයි.

දැඩි මාදිලිය සමඟ, ඔබට ප්‍රකාශයට පත් නොකළ විචල්‍යයන් භාවිතා කළ නොහැක.

දැඩි ප්‍රකාරය ඇයි?

දැඩි මාදිලිය "ආරක්ෂිත" ජාවාස්ක්‍රිප්ට් ලිවීම පහසු කරයි.

දැඩි මාදිලිය කලින් පිළිගත් "නරක සින්ටැක්ස්" සැබෑ දෝෂ බවට වෙනස් කරයි.

උදාහරණයක් ලෙස, සාමාන්‍ය ජාවාස්ක්‍රිප්ට් වලදී, විචල්‍ය නාමයක් වැරදි ලෙස ටයිප් කිරීමෙන් නව ගෝලීය විචල්‍යයක් නිර්මාණය වේ. දැඩි ප්‍රකාරයේදී, මෙය දෝෂයක් ඇති කරයි, අහම්බෙන් ගෝලීය විචල්‍යයක් නිර්මාණය කිරීමට නොහැකි වේ.

සාමාන්‍ය ජාවාස්ක්‍රිප්ට් හි, සංවර්ධකයාට ලිවිය නොහැකි ගුණාංග සඳහා අගයන් පැවරීමේ කිසිදු දෝෂ ප්‍රතිපෝෂණයක් නොලැබෙනු ඇත.

දැඩි ප්‍රකාරයේදී, ලිවිය නොහැකි දේපලකට, ලබා ගන්නෙකුට පමණක් ඇති දේපලක්, නොපවතින දේපලක්, නොපවතින විචල්‍යයක් හෝ නොපවතින වස්තුවක් සඳහා වන ඕනෑම පැවරුමක් දෝෂයක් ඇති කරයි.

වැඩි විස්තර දැනගැනීම සඳහා කරුණාකර http://www.w3schools.com/js/js_strict.asp වෙත යොමු වන්න


37

"use strict"ජාවාස්ක්‍රිප්ට් කේතය දැඩි ආකාරයකින් ක්‍රියාත්මක කිරීමට සලස්වයි , එයින් මූලික වශයෙන් අදහස් කරන්නේ භාවිතයට පෙර සියල්ල නිර්වචනය කළ යුතු බවයි. දැඩි මාදිලියක් භාවිතා කිරීමට ප්‍රධාන හේතුව වන්නේ නිර්වචනය නොකළ ක්‍රමවේදයන් අහම්බෙන් ගෝලීය භාවිතයෙන් වළක්වා ගැනීමයි.

දැඩි මාදිලියේදී, දේවල් වේගයෙන් ක්‍රියාත්මක වේ, සමහර අනතුරු ඇඟවීම් හෝ නිහ silent අනතුරු ඇඟවීම් මාරාන්තික දෝෂ ඇති කරයි, සෑම විටම එය නියත කේතයක් සෑදීම සඳහා භාවිතා කිරීම වඩා හොඳය.

"use strict"ECMA5 හි භාවිතා කිරීම සඳහා පුළුල් ලෙස අවශ්‍ය වේ, ECMA6 හි එය පෙරනිමියෙන් ජාවාස්ක්‍රිප්ට් හි කොටසකි , එබැවින් ඔබ ES6 භාවිතා කරන්නේ නම් එය එකතු කිරීම අවශ්‍ය නොවේ.

MDN වෙතින් මෙම ප්‍රකාශ සහ උදාහරණ දෙස බලන්න:

"භාවිතා
කිරීම දැඩි" විධානය ජාවාස්ක්‍රිප්ට් 1.8.5 (ECMAScript අනුවාදය 5) හි "දැඩි භාවිතය" විධානය අළුත් ය. එය ප්‍රකාශයක් නොව, ජාවාස්ක්‍රිප්ට් හි පෙර අනුවාදයන් විසින් නොසලකා හරින ලද වචනාර්ථ ප්‍රකාශනයකි. “දැඩි ලෙස භාවිතා කිරීම” හි අරමුණ වන්නේ කේතය “දැඩි ප්‍රකාරයේදී” ක්‍රියාත්මක කළ යුතු බවයි. දැඩි මාදිලිය සමඟ, ඔබට ප්‍රකාශයට පත් නොකළ විචල්‍යයන් භාවිතා කළ නොහැක.

"දැඩි ලෙස භාවිතා කරන්න" භාවිතා කිරීමේ උදාහරණ:
ශ්‍රිත සඳහා දැඩි ප්‍රකාරය: ඒ හා සමානව, ශ්‍රිතයක් සඳහා දැඩි ප්‍රකාරයක් යෙදීමට, "දැඩි ලෙස භාවිතා කරන්න" යන ප්‍රකාශය තබන්න; (හෝ 'දැඩි ලෙස භාවිතා කරන්න';) වෙනත් ප්‍රකාශයකට පෙර ශ්‍රිතයේ ශරීරයේ.

1) කාර්යයන්හි දැඩි මාදිලිය

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) සම්පූර්ණ ස්ක්‍රිප්ට් දැඩි මාදිලිය

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) ලිවිය නොහැකි ගෝලීයයකට පැවරීම

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

ඔබට MDN පිළිබඳ වැඩිදුර කියවිය හැකිය .


31

ECMAScript කමිටුවේ සිටි සමහර අයගේ හොඳ කතාවක් තිබේ: JavaScript හි වෙනස්වීම්, 1 වන කොටස: ECMAScript 5 ""use strict" ස්විචය වැඩි වැඩියෙන් භාවිතා කිරීම ජාවාස්ක්‍රිප්ට් ක්‍රියාත්මක කරන්නන්ට සෑම වෙබ් අඩවියක්ම හදිසියේම කඩ නොකර ජාවාස්ක්‍රිප්ට් හි භයානක අංග රාශියක් පිරිසිදු කිරීමට ඉඩ දෙන්නේ කෙසේද යන්න පිළිබඳව. ලොවෙහි.

ඇත්ත වශයෙන්ම එය එම වැරදි බොහෝමයක් (තිබුනේ) සහ ECMAScript 5 ඒවා නිවැරදි කරන්නේ කෙසේද යන්න ගැන ද කතා කරයි.


27

සංසන්දනය කිරීමට කුඩා උදාහරණ:

දැඩි නොවන මාදිලිය:

for (i of [1,2,3]) console.log(i)
    
// output:
// 1
// 2
// 3

දැඩි මාදිලිය:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

දැඩි නොවන මාදිලිය:

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true


2
ඉහත කේතය ගෝලීය විෂය පථයට i විචල්‍යය එක් කරන බව සලකන්න (සාමාන්‍යයෙන් මෙය හොඳම භාවිතයක් නොවන අතර දැඩි මාදිලිය එය වළක්වා ගැනීමට උපකාරී වේ).
මයිකල්

1
දෙවන උදාහරණය යමෙකුට පැහැදිලි කළ හැකිද? මට ඒක තේරෙන්නේ නැහැ. this === 'a'උදාහරණ දෙකෙහිම තිබිය යුතු නොවේද ?
මැක්සිමබ්

19

EcmaScript 5use strict හි හඳුන්වා දුන් සටහන එතැන් සිට තබා ඇති බව සලකන්න .

ES6 සහ ES7 හි දැඩි මාදිලිය අවුලුවාලීමේ කොන්දේසි පහත දැක්වේ :

  • ගෝලීය කේතය දැඩි මාදිලියේ කේතයක් වන අතර එය භාවිතා කරන්නේ දැඩි විධානයක් අඩංගු ඩිරෙක්ටිව් පෙරවදනකින් නම් (14.1.1 බලන්න).
  • මොඩියුල කේතය සෑම විටම දැඩි මාදිලි කේතයකි.
  • එය සියලු කොටස් ClassDeclaration හෝ ClassExpression දැඩි මාදිලිය කේතය වේ.
  • ඊවාල් කේතය දැඩි මාදිලියේ කේතයක් වන අතර එය භාවිතා කරන්නේ දැඩි විධානයක් අඩංගු ඩිරෙක්ටිව් ප්‍රොග්ලොග් එකකින් නම් හෝ එවාල් සඳහා වන ඇමතුම සෘජු එවාල් නම් (බලන්න 12.3.4.1 බලන්න) එය දැඩි මාදිලියේ කේතයක අඩංගු වේ.
  • ආශ්‍රිත FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition, හෝ ArrowFunction දැඩි මාදිලියේ කේතයක අඩංගු නම් හෝ ශ්‍රිතයේ [[ECMAScriptCode]] අභ්‍යන්තර ස්ලට් එකෙහි අගය නිපදවන කේතය ඇරඹෙන්නේ නම් , ක්‍රියාකාරී කේතය දැඩි ප්‍රකාර කේතයකි. භාවිත දැඩි නියෝගයක් අඩංගු වේ.
  • අවසාන තර්කය නූලක් නම්, ගොඩනඟන ලද ශ්‍රිතයට සහ උත්පාදක ඉදිකිරීම්කරුවන්ට තර්ක ලෙස සපයනු ලබන ශ්‍රිත කේතය දැඩි ක්‍රියා කේතයක් වන අතර එය ක්‍රියාවට නංවන විට එය ක්‍රියාකාරී බොඩි එකක් වන අතර එය ක්‍රියාකාරී පෙරවදනකින් ආරම්භ වන අතර එය භාවිතා කිරීම දැඩි විධානයක් අඩංගු වේ.

14

සංවර්ධකයින් භාවිතා කළ යුතු ප්‍රධාන හේතු "use strict":

  1. ගෝලීය විචල්‍යයන් අහම්බෙන් ප්‍රකාශ කිරීම වළක්වයි . භාවිතයෙන් පෙර "use strict()"විචල්‍යයන් ප්‍රකාශයට පත් කිරීමට වග බලා ගනී var. උදා:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
  2. සැ.යු: "use strict"විධානය හඳුනාගත හැක්කේ පිටපතක් හෝ ශ්‍රිතයක ආරම්භයේ දී පමණි.
  3. නූල "arguments"විචල්යයක් ලෙස භාවිතා කළ නොහැක:

    "use strict";
    var arguments = 3.14;    // This will cause an error
  4. වචන ලෙස විචල්‍ය ලෙස භාවිතා කිරීම සීමා කරනු ඇත. ඒවා භාවිතා කිරීමට උත්සාහ කිරීමෙන් දෝෂ ඇතිවේ.

කෙටියෙන් කිවහොත් ඔබේ කේතය අඩු දෝෂ සහිත වන අතර අනෙක් අතට ඔබ හොඳ කේතයක් ලිවීමට සලස්වයි.

ඒ ගැන වැඩිදුර කියවීමට ඔබට මෙහි යොමු විය හැකිය .


12

"දැඩි ලෙස භාවිතා කරන්න"; යනු ජාවාස්ක්‍රිප්ට් තව ටිකක් ශක්තිමත් කිරීමට ECMA උත්සාහයයි. එය අවම වශයෙන් මඳක් “දැඩි” කිරීමට ජේඑස් උත්සාහයක් ගෙන එයි (වෙනත් භාෂා 90 දශකයේ සිට දැඩි නීති ක්‍රියාත්මක කරයි). එය සැබවින්ම ජාවාස්ක්‍රිප්ට් සංවර්ධකයින්ට යම් ආකාරයක කේතීකරණ හොඳම භාවිතයන් අනුගමනය කිරීමට බල කරයි. තවමත්, ජාවාස්ක්‍රිප්ට් ඉතා බිඳෙන සුළුය. ටයිප් කළ විචල්‍යයන්, ටයිප් කළ ක්‍රම වැනි දෙයක් නොමැත. ජාවාස් හෝ ඇක්ෂන් ස්ක්‍රිප්ට් 3 වැනි වඩා ශක්තිමත් භාෂාවක් ඉගෙන ගන්නා ලෙස මම ජාවාස්ක්‍රිප්ට් සංවර්ධකයින්ට තරයේ නිර්දේශ කරමි. නිදොස්කරණය.


12

ජාවාස්ක්‍රිප්ට් “දැඩි” මාදිලිය ECMAScript 5 හි හඳුන්වා දෙන ලදි.

(function() {
  "use strict";
  your code...
})();

"use strict";ඔබේ JS ගොනුවේ ඉහළින්ම ලිවීම දැඩි සින්ටැක්ස් පරීක්ෂාව සක්‍රීය කරයි. එය අප වෙනුවෙන් පහත සඳහන් කාර්යයන් කරයි:

  1. ඔබ ප්‍රකාශයට පත් නොකළ විචල්‍යයකට පැවරීමට උත්සාහ කරන්නේ නම් දෝෂයක් පෙන්වයි

  2. යතුරු JS පද්ධති පුස්තකාල නැවත ලිවීමෙන් ඔබව වළක්වයි

  3. සමහර අනාරක්ෂිත හෝ දෝෂ සහිත භාෂා විශේෂාංග තහනම් කරයි

use strictතනි කාර්යයන් තුළ ද ක්‍රියා කරයි. use strictඔබේ කේතයට ඇතුළත් කිරීම සැමවිටම වඩා හොඳ පුරුද්දකි .

බ්‍රව්සර් අනුකූලතා ගැටළුව: “භාවිතා” විධානයන් පසුපසට අනුකූල වේ. ඒවාට සහය නොදක්වන බ්‍රව්සර් තවදුරටත් යොමු නොකෙරෙන වචන මාලාවක් දකිනු ඇත. ඉතින්, ඔවුන් එය පසුකර ඉදිරියට යනු ඇත.


12

use strictඔබගේ කේතය ආරක්ෂිත කිරීමට ක්‍රමයක් වන අතර, ඔබ බලාපොරොත්තු වන පරිදි ක්‍රියා කළ නොහැකි භයානක විශේෂාංග භාවිතා කළ නොහැක. තවද, කලින් ලියා ඇති පරිදි, එය කේතය වඩාත් දැඩි කරයි.


11

පොදු සහ නැවත නැවත වැරදි පෙන්වීමට ස්ට්‍රයික් භාවිතා කරන්න, එවිට එය වෙනස් ලෙස හැසිරවිය හැකි අතර ජාවා ස්ක්‍රිප්ට් ධාවනය වන ආකාරය වෙනස් කරයි, එවැනි වෙනස්කම්:

  • අහම්බෙන් ගෝලීය වීම වළක්වයි

  • අනුපිටපත් නොමැත

  • සමඟ ඉවත් කරයි

  • මෙම බලහත්කාරය ඉවත් කරයි

  • ආරක්ෂිත eval ()

  • වෙනස් කළ නොහැකි දේ සඳහා දෝෂ

ඔබ ද මෙය කියවන්න පුළුවන් ලිපිය විස්තර සඳහා


11

සාමාන්‍යයෙන්, ජාවාස්ක්‍රිප්ට් දැඩි නීති රීති අනුගමනය නොකරන බැවින් දෝෂ ඇතිවීමේ සම්භාවිතාව වැඩිවේ. භාවිතා කිරීමෙන් පසු "use strict", ජාවාස්ක්‍රිප්ට් කේතය වෙනත් ක්‍රමලේඛන භාෂාවල මෙන් ටර්මිනේටර් භාවිතා කිරීම, ආරම්භ කිරීමට පෙර ප්‍රකාශ කිරීම වැනි දැඩි නීති මාලාවක් අනුගමනය කළ යුතුය.

"use strict"භාවිතා කරන්නේ නම් , කේතය ලිවිය යුත්තේ දැඩි නීති මාලාවක් අනුගමනය කිරීමෙන් වන අතර එමඟින් දෝෂ සහ අවිනිශ්චිතතාවයන් අඩු වේ.


7

"දැඩි ලෙස භාවිතා කරන්න"; ජාවාස්ක්‍රිප්ට් කේතය "දැඩි ආකාරයෙන්" ක්‍රියාත්මක කළ යුතු බව අර්ථ දක්වයි.

  • ECMAScript අනුවාදය 5 හි "දැඩි ලෙස භාවිතා කිරීම" විධානය අළුත් විය.
  • එය ප්‍රකාශයක් නොව, ජාවාස්ක්‍රිප්ට් හි පෙර අනුවාදයන් විසින් නොසලකා හරින ලද වචනාර්ථ ප්‍රකාශනයකි.
  • “දැඩි ලෙස භාවිතා කිරීම” හි අරමුණ වන්නේ කේතය “දැඩි ප්‍රකාරයේදී” ක්‍රියාත්මක කළ යුතු බවයි.
  • දැඩි මාදිලිය සමඟ, ඔබට ප්‍රකාශයට පත් නොකළ විචල්‍යයන් භාවිතා කළ නොහැක.

ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් 9 සහ ඊට පහළ හැර සියලුම නවීන බ්‍රව්සර් “දැඩි ලෙස භාවිතා කිරීමට” සහාය දක්වයි .

අවාසිය

සංවර්ධකයෙකු දැඩි මාදිලියේ පුස්තකාලයක් භාවිතා කළ නමුත් සංවර්ධකයා සාමාන්‍ය ප්‍රකාරයේදී වැඩ කිරීමට පුරුදුව සිටියේ නම්, ඔවුන් බලාපොරොත්තු වූ පරිදි ක්‍රියා නොකරන පුස්තකාලයේ යම් ක්‍රියාමාර්ගයක් කැඳවිය හැකිය.

නරකම දෙය නම්, සංවර්ධකයා සාමාන්‍ය මාදිලියේ සිටින බැවින්, අමතර දෝෂ විසි කිරීමේ වාසි ඔවුන්ට නොමැති බැවින් දෝෂය නිහ .ව අසමත් විය හැකිය.

එසේම, ඉහත ලැයිස්තුගත කර ඇති පරිදි, දැඩි මාදිලිය මඟින් යම් යම් දේ කිරීමෙන් ඔබව වළක්වයි.

මිනිසුන් සාමාන්‍යයෙන් සිතන්නේ ඔබ ඒවා මුලින් භාවිතා නොකළ යුතු බවයි, නමුත් සමහර සංවර්ධකයින් එම බාධාවට කැමති නැති අතර භාෂාවේ සියලුම අංග භාවිතා කිරීමට කැමති වේ.


4

දැඩි මාදිලිය මඟින් මතක කාන්දු වීම වළක්වා ගත හැකිය.

කරුණාකර පහත සඳහන් ශ්‍රිතය දැඩි නොවන ආකාරයෙන් පරීක්ෂා කරන්න:

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

මෙම ශ්‍රිතයේදී අපි භාවිතා කරන්නේ විචල්‍යයක් ලෙස හැඳින්වෙන විචල්‍යයකි name ශ්‍රිතය තුළ ඇති . අභ්‍යන්තරව, සම්පාදකයා විසින් එම ශ්‍රිත විෂය පථය තුළ එම නම සමඟ ප්‍රකාශිත විචල්‍යයක් තිබේදැයි පළමුව පරීක්ෂා කරනු ඇත. එවැනි විචල්‍යයක් නොමැති බව සම්පාදකයා තේරුම් ගෙන ඇති බැවින්, එය පිටත විෂය පථය තුළ පරීක්ෂා කරනු ඇත. අපගේ නඩුවේ එය ගෝලීය විෂය පථයයි. නැවතත්, සම්පාදකයා තේරුම් ගෙන ඇත්තේ එම නාමය සමඟ ගෝලීය අවකාශයේ කිසිදු විචල්‍යයක් ප්‍රකාශයට පත් නොවන බැවින් ගෝලීය අවකාශය තුළ එය අපට එවැනි විචල්‍යයක් නිර්මාණය කරන බවයි. සංකල්පමය වශයෙන්, මෙම විචල්‍යය ගෝලීය විෂය පථය තුළ නිර්මාණය වන අතර එය සමස්ත යෙදුම තුළම ලබා ගත හැකිය.

තවත් සිද්ධියක් නම්, ළමා ශ්‍රිතයක විචල්‍යය ප්‍රකාශයට පත් කිරීමයි. එවැනි අවස්ථාවකදී, සම්පාදකයා එම විචල්‍යයේ වලංගු භාවය බාහිර විෂය පථය තුළ පරීක්ෂා කරයි, එනම් මව් ශ්‍රිතය. එවිට පමණක් එය ගෝලීය අවකාශය පරීක්ෂා කර එහි අපට විචල්‍යයක් නිර්මාණය කරනු ඇත. ඒ කියන්නේ අමතර චෙක්පත් කළ යුතුයි. මෙය යෙදුමේ ක්‍රියාකාරීත්වයට බලපානු ඇත.


දැන් අපි එකම ශ්‍රිතය දැඩි ආකාරයෙන් ලියමු.

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

අපට පහත දෝෂය ලැබෙනු ඇත.

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

මෙන්න, සම්පාදකයා යොමු දෝෂය විසි කරයි. දැඩි ප්‍රකාරයේදී, විචල්‍යය ප්‍රකාශ නොකර එය භාවිතා කිරීමට සම්පාදකයා අපට ඉඩ නොදේ. එබැවින් මතක කාන්දු වීම වළක්වා ගත හැකිය. ඊට අමතරව, අපට වඩාත් ප්‍රශස්ත කේත ලිවිය හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.