var functionName = ශ්‍රිතය () function} එදිරිව ශ්‍රිත ශ්‍රිතය නම () {}


6876

මම මෑතකදී වෙනත් කෙනෙකුගේ ජාවාස්ක්‍රිප්ට් කේතය නඩත්තු කිරීමට පටන් ගතිමි. මම දෝෂ නිවැරදි කරමින්, විශේෂාංග එකතු කරමින් කේතය පිළිවෙලට සකස් කර එය වඩාත් ස්ථාවර කිරීමට උත්සාහ කරමි.

පෙර සංවර්ධකයා විසින් කාර්යයන් ප්‍රකාශ කිරීමේ ක්‍රම දෙකක් භාවිතා කළ අතර එය පිටුපස හේතුවක් තිබේද නැද්ද යන්න මට ක්‍රියාත්මක කළ නොහැක.

ක්‍රම දෙක නම්:

var functionOne = function() {
    // Some code
};
function functionTwo() {
    // Some code
}

මෙම වෙනස් ක්‍රම දෙක භාවිතා කිරීමට හේතු මොනවාද සහ එක් එක් වාසි සහ අවාසි මොනවාද? එක් ක්‍රමයක් සමඟ කළ හැකි වෙනත් ක්‍රමයක් තිබේද?


200
permadi.com/tutorial/jsFunc/index.html යනු ජාවාස්ක්‍රිප්ට් කාර්යයන් පිළිබඳ ඉතා හොඳ පිටුවකි
uzay95

68
සම්බන්ධිත නම් කරන ලද ක්‍රියාකාරී ප්‍රකාශන පිළිබඳ මෙම විශිෂ්ට ලිපිය .
ෆ්‍රොග්ස්

13
@CMS යොමු මෙම ලිපිය: kangax.github.com/nfe/#expr-vs-decl
Upperstage

107
ඔබ දැනුවත් විය යුතු කරුණු දෙකක් තිබේ: # 1 ජාවාස්ක්‍රිප්ට් හි ප්‍රකාශන ඔසවා ඇත. var a = 1; var b = 2;බවට පත්වන අර්ථය var a; var b; a = 1; b = 2. එබැවින් ඔබ ශ්‍රිතය ප්‍රකාශ කරන විට එය ප්‍රකාශයට පත් වන නමුත් එහි අගය වහාම සකසනු නොලැබේ. FunctionTwo යනු ප්‍රකාශයක් පමණක් වන අතර, එය විෂය පථයේ ඉහළින්ම තබයි. # 2 functionTwo ඔබට නම දේපල වෙත ප්‍රවේශ වීමට ඉඩ දෙන අතර යමක් නිදොස් කිරීමට උත්සාහ කිරීමේදී එය බොහෝ සෙයින් උපකාරී වේ.
xavierm02

66
ඔහ් සහ btw, නිවැරදි වාක්‍ය ඛණ්ඩය ";" පැවරුමෙන් පසුව සහ ප්‍රකාශයෙන් පසුව. උදා: function f(){}එදිරිව var f = function(){};.
xavierm02

Answers:


5048

වෙනස වන්නේ functionOneඑය ශ්‍රිත ප්‍රකාශනයක් වන අතර එය අර්ථ දැක්වෙන්නේ එම රේඛාව ළඟා වූ විට පමණක් වන අතර functionTwoඑය ශ්‍රිත ප්‍රකාශයක් වන අතර එය අවට ශ්‍රිතය හෝ ස්ක්‍රිප්ට් ක්‍රියාත්මක වූ විගස අර්ථ දැක්වේ ( එසවීම හේතුවෙන් ).

උදාහරණයක් ලෙස, ශ්‍රිත ප්‍රකාශනයක්:

// TypeError: functionOne is not a function
functionOne();

var functionOne = function() {
  console.log("Hello!");
};

තවද, ශ්‍රිත ප්‍රකාශයක්:

// Outputs: "Hello!"
functionTwo();

function functionTwo() {
  console.log("Hello!");
}

Ically තිහාසිකව, කුට්ටි තුළ අර්ථ දක්වා ඇති ශ්‍රිත ප්‍රකාශන බ්‍රව්සර් අතර නොගැලපෙන ලෙස හැසිරවිය. දැඩි ප්‍රකාරය (ES5 හි හඳුන්වා දී ඇත) ශ්‍රිත ප්‍රකාශන ඒවායේ කොටු කොටසට පරික්ෂා කිරීමෙන් මෙය විසඳනු ලැබීය.

'use strict';    
{ // note this block!
  function functionThree() {
    console.log("Hello!");
  }
}
functionThree(); // ReferenceError


634
Reg ග්‍රෙග්: මාර්ගය වන විට, වෙනස වන්නේ ඒවා විවිධ වේලාවන්හි විග්‍රහ කිරීම පමණක් නොවේ. අත්යවශ්යයෙන්ම, ඔබ functionOneහුදෙක් නිර්නාමික ශ්‍රිතයක් පවරා ඇති විචල්‍යයක් වන අතර functionTwoඇත්ත වශයෙන්ම නම් කරන ලද ශ්‍රිතයකි. .toString()වෙනස බැලීමට දෙදෙනාම අමතන්න . ක්‍රමානුකූලව ශ්‍රිතයක නම ලබා ගැනීමට ඔබට අවශ්‍ය සමහර අවස්ථාවල මෙය වැදගත් වේ.
ජේසන් බන්ටිං

6
Ason ජේසන් බන්ටිං .. ඔබ මෙහි පැමිණෙන්නේ කුමක් දැයි විශ්වාස නැත, .toString () දෙකටම එකම අගය (ක්‍රියාකාරී අර්ථ දැක්වීම) ලබා දෙන බව පෙනේ: cl.ly/2a2C2Y1r0J451o0q0B1B
ජෝන් z

125
දෙකම වෙනස් ය. පළමුවැන්න function expressionදෙවැන්න අ function declaration. මාතෘකාව පිළිබඳ වැඩි විස්තර මෙතැනින් ඔබට කියවිය හැකිය: javascriptweblog.wordpress.com/2010/07/06/…
මයිකල් කුක්ලිස්

128
Reg ග්‍රෙග් විග්‍රහ කිරීමේ වේලාවට එදිරිව ධාවන වේලාව පිළිබඳ ඔබේ පිළිතුරේ කොටස නිවැරදි නොවේ. ජාවාස්ක්‍රිප්ට් හි, ශ්‍රිත ප්‍රකාශන අර්ථ දැක්වෙන්නේ විග්‍රහ කරන වේලාව තුළ නොව ධාවන කාලය තුළ ය. ක්‍රියාවලිය මේ ආකාරයට ය: ප්‍රභව කේතය විග්‍රහ කර ඇත -> ජාවාස්ක්‍රිප්ට් වැඩසටහන ඇගයීමට ලක් කෙරේ -> ගෝලීය ක්‍රියාත්මක කිරීමේ සන්දර්භය ආරම්භ කර ඇත -> ප්‍රකාශන බන්ධන ක්ෂණිකකරණය සිදු කරනු ලැබේ. මෙම ක්‍රියාවලිය අතරතුර ශ්‍රිත ප්‍රකාශන ක්ෂණික වේ ( 10.5 වන පරිච්ඡේදයේ 5 වන පියවර බලන්න ).
අයිම් විදාස්

103
මෙම සංසිද්ධිය සඳහා පාරිභාෂිතය එසවීම ලෙස හැඳින්වේ.
කොලින් පෙයාර්

1944

පළමුව මට ග්‍රෙග් නිවැරදි කිරීමට අවශ්‍යයි: විෂය function abc(){}පථයද ඇත - abcමෙම අර්ථ දැක්වීම හමු වූ විෂය පථය තුළ නම අර්ථ දක්වා ඇත. උදාහරණයක්:

function xyz(){
  function abc(){};
  // abc is defined here...
}
// ...but not here

දෙවනුව, මෝස්තර දෙකම ඒකාබද්ධ කළ හැකිය:

var xyz = function abc(){};

xyzසුපුරුදු පරිදි අර්ථ දැක්වීමට යන්නේ, abcසියලු බ්‍රව්සර්වල නිර්වචනය කර නැති නමුත් ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් - එය අර්ථ දැක්වීම මත රඳා නොසිටින්න. නමුත් එය එහි ශරීරය තුළ නිර්වචනය කරනු ඇත:

var xyz = function abc(){
  // xyz is visible here
  // abc is visible here
}
// xyz is visible here
// abc is undefined here

සියලුම බ්‍රව්සර්වල අන්වර්ථ කාර්යයන් කිරීමට ඔබට අවශ්‍ය නම්, මේ ආකාරයේ ප්‍රකාශයක් භාවිතා කරන්න:

function abc(){};
var xyz = abc;

මෙම අවස්ථාවේ දී, දෙකම xyzසහ abcඑකම වස්තුවක අන්වර්ථයන් වේ:

console.log(xyz === abc); // prints "true"

ඒකාබද්ධ ශෛලිය භාවිතා කිරීමට එක් ප්‍රබල හේතුවක් වන්නේ ක්‍රියාකාරී වස්තූන්ගේ “නම” ගුණාංගය ( ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් සහාය නොදක්වයි ). මූලික වශයෙන් ඔබ වැනි ශ්‍රිතයක් අර්ථ දක්වන විට

function abc(){};
console.log(abc.name); // prints "abc"

එහි නම ස්වයංක්‍රීයව පවරා ඇත. නමුත් ඔබ එය අර්ථ දක්වන විට

var abc = function(){};
console.log(abc.name); // prints ""

එහි නම හිස් ය - අපි නිර්නාමික ශ්‍රිතයක් නිර්මාණය කර එය යම් විචල්‍යයකට පවරා ඇත්තෙමු.

ඒකාබද්ධ ශෛලිය භාවිතා කිරීමට තවත් හොඳ හේතුවක් වන්නේ බාහිර පරිශීලකයින් සඳහා දිගු පරස්පර විරෝධී නමක් සපයන අතරම තමා ගැන සඳහන් කිරීමට කෙටි අභ්‍යන්තර නමක් භාවිතා කිරීමයි:

// Assume really.long.external.scoped is {}
really.long.external.scoped.name = function shortcut(n){
  // Let it call itself recursively:
  shortcut(n - 1);
  // ...
  // Let it pass itself as a callback:
  someFunction(shortcut);
  // ...
}

ඉහත උදාහරණයේ දී අපට බාහිර නමකින් එය කළ හැකිය, නමුත් එය අධික ලෙස (හා මන්දගාමී) වනු ඇත.

(තමා ගැනම සඳහන් කළ හැකි තවත් ක්‍රමයක් නම් arguments.callee, එය තවමත් සාපේක්ෂව දිගු වන අතර දැඩි ප්‍රකාරයට සහාය නොදක්වයි.)

ජාවාස්ක්‍රිප්ට් ප්‍රකාශ දෙකම වෙනස් ආකාරයකින් සලකයි. මෙය ශ්‍රිත ප්‍රකාශයකි:

function abc(){}

abc වත්මන් විෂය පථයේ සෑම තැනකම මෙහි අර්ථ දක්වා ඇත:

// We can call it here
abc(); // Works

// Yet, it is defined down there.
function abc(){}

// We can call it again
abc(); // Works

එසේම එය returnප්‍රකාශයක් මගින් ඔසවා ඇත :

// We can call it here
abc(); // Works
return;
function abc(){}

මෙය ශ්‍රිත ප්‍රකාශනයකි:

var xyz = function(){};

xyz පැවරුම් ස්ථානයේ සිට මෙහි අර්ථ දක්වා ඇත:

// We can't call it here
xyz(); // UNDEFINED!!!

// Now it is defined
xyz = function(){}

// We can call it here
xyz(); // works

ක්‍රියාකාරී ප්‍රකාශනය එදිරිව ශ්‍රිත ප්‍රකාශනය යනු ග්‍රෙග් විසින් පෙන්නුම් කරන ලද වෙනසක් ඇතිවීමට සැබෑ හේතුවයි.

විනෝදජනක කාරණය:

var xyz = function abc(){};
console.log(xyz.name); // Prints "abc"

පුද්ගලිකව, මම දෘශ්‍ය ක්‍රියාකාරිත්වය පාලනය කළ හැකි නිසා "ක්‍රියාකාරී ප්‍රකාශනය" ප්‍රකාශයට කැමැත්තෙමි. මම වැනි ශ්‍රිතය අර්ථ දක්වන විට

var abc = function(){};

මම දේශීයව ශ්‍රිතය නිර්වචනය කළ බව මම දනිමි. මම වැනි ශ්‍රිතය අර්ථ දක්වන විට

abc = function(){};

මා එය ගෝලීයව අර්ථ දක්වා ඇති බව මම දනිමි abc. මෙම අර්ථ දැක්වීමේ විලාසය ඇතුළත භාවිතා කරන විට පවා ඔරොත්තු දීමේ හැකියාව ඇත eval(). නිර්වචනය අතර

function abc(){};

සන්දර්භය මත රඳා පවතින අතර එය සැබවින්ම අර්ථ දක්වා ඇති ස්ථානය අනුමාන කිරීමට ඔබට ඉඩ ඇත, විශේෂයෙන් නම් eval()- පිළිතුර: එය බ්‍රව්සරය මත රඳා පවතී.


70
මම රොබර්ග් වෙත යොමු කළ නමුත් ඔහු කොතැනකවත් සොයා ගත නොහැක. සරල: RoBorg === ග්‍රෙග්. අන්තර්ජාල යුගයේ ඉතිහාසය නැවත ලිවිය හැක්කේ එලෙසිනි. ;-)
ඉයුජින් ලාසුට්කින්

10
var xyz = ශ්‍රිතය abc () {}; console.log (xyz === abc); මා විසින් පරීක්ෂා කරන ලද සියලුම බ්‍රව්සර් (සෆාරි 4, ෆයර්ෆොක්ස් 3.5.5, ඔපෙරා 10.10) මට "නිර්වචනය නොකළ විචල්‍යය: abc" ලබා දෙයි.
NVI

7
සමස්තයක් ලෙස මා සිතන්නේ මෙම ප්‍රකාශය ශ්‍රිත ප්‍රකාශය භාවිතා කිරීමේ වාසි සහ වාසි පැහැදිලි කිරීමට හොඳ කාර්යයක් කරයි. විචල්‍යයකට ශ්‍රිත ප්‍රකාශන පැවරුම් භාවිතා කිරීමේ ප්‍රතිලාභ ගැන එකඟ නොවීමට මම එකඟ වෙමි, විශේෂයෙන් “ප්‍රතිලාභය” යනු ගෝලීය ආයතනයක් ප්‍රකාශයට පත්කිරීමේ උපදේශයක් ලෙස පෙනේ ... තවද ඔබ ගෝලීය නාම අවකාශය අවුල් නොකළ යුතු බව සියලු දෙනා දනිති. , හරිද? ;-)
natlee75

84
නම් කරන ලද ශ්‍රිතය භාවිතා කිරීමට විශාල හේතුවක් වන්නේ ඔබේ ඇමතුම් තොගය හෝ තොග හෝඩුවාව පිළිබඳ අවබෝධයක් ලබා ගැනීමට නිදොස් කරන්නන්ට නම භාවිතා කළ හැකි බැවිනි. ඔබ ඇමතුම් තොගය දෙස බලා මට්ටම් 10 ක් ගැඹුරින් “නිර්නාමික ශ්‍රිතය” දකින විට එය උරා ගනී ...
එළු

3
var abc = function(){}; console.log(abc.name);""තවත් නිපදවන්නේ නැත, ඒ "abc"වෙනුවට.
Qwerty

633

කාර්යයන් නිර්මාණය කරන සම්මත ආකෘතිවල අඩු කිරීම මෙන්න: (මුලින් වෙනත් ප්‍රශ්නයක් සඳහා ලියා ඇත, නමුත් කැනොනිකල් ප්‍රශ්නයට මාරු කිරීමෙන් පසුව අනුවර්තනය කරන ලදි.)

කොන්දේසි:

ඉක්මන් ලැයිස්තුව:

  • කාර්ය ප්‍රකාශනය

  • "නිර්නාමික" functionප්‍රකාශනය (මෙම පදය තිබියදීත්, සමහර විට නම් සහිත කාර්යයන් නිර්මාණය කරයි)

  • functionප්‍රකාශනය ලෙස නම් කර ඇත

  • ප්රවේශ කාරක ආරම්භක (ES5 +)

  • ඊතල ශ්‍රිත ප්‍රකාශනය (ES2015 +) (නිර්නාමික ශ්‍රිත ප්‍රකාශන මෙන්, පැහැදිලි නමක් ඇතුළත් නොවන අතර තවමත් නම් සමඟ ශ්‍රිත නිර්මාණය කළ හැකිය)

  • වස්තු ආරම්භකයේ ක්‍රම ප්‍රකාශය (ES2015 +)

  • class(ES2015 +) හි ඉදිකිරීම්කරු සහ ක්‍රම ප්‍රකාශන

කාර්ය ප්‍රකාශනය

පළමු පෝරමය ශ්‍රිත ප්‍රකාශයකි , එය මේ ආකාරයෙන් පෙනේ:

function x() {
    console.log('x');
}

ශ්‍රිත ප්‍රකාශයක් යනු ප්‍රකාශයකි ; එය ප්‍රකාශයක් හෝ ප්‍රකාශනයක් නොවේ. එනිසා ඔබ එය අනුගමනය නොකරන්නේ ;(එසේ කිරීම හානිකර නොවන නමුත්).

ඕනෑම පියවරෙන් පියවර කේතයක් ක්‍රියාත්මක කිරීමට පෙර , එය ක්‍රියාත්මක වන සන්දර්භය තුළට ක්‍රියාත්මක වන විට ශ්‍රිත ප්‍රකාශයක් සකසනු ලැබේ. එය නිර්මාණය කරන ශ්‍රිතයට නිසි නමක් ලබා දී ඇත ( xඉහත උදාහරණයේ), එම නම ප්‍රකාශය දිස්වන විෂය පථයට ඇතුළත් කර ඇත.

එකම සන්දර්භය තුළ ඕනෑම පියවරෙන් පියවර කේතයකට පෙර එය සකසා ඇති නිසා, ඔබට මෙවැනි දේ කළ හැකිය:

x(); // Works even though it's above the declaration
function x() {
    console.log('x');
}

ES2015 තෙක්, පිරිවිතර ජාවාස්ක්රිප්ට් එන්ජිම ඔබ වැනි පාලන ව්යුහය තුල උත්සවයකට ප්රකාශ දෙනවා නම් ඔබ කළ යුතු දේ ආවරණය කළේ නැත try, if, switch, whileමේ වගේ, ආදිය,:

if (someCondition) {
    function foo() {    // <===== HERE THERE
    }                   // <===== BE DRAGONS
}

පියවරෙන් පියවර කේතය ක්‍රියාත්මක කිරීමට පෙර ඒවා සකසන බැවින්, ඒවා පාලන ව්‍යුහයක සිටින විට කුමක් කළ යුතු දැයි දැන ගැනීම උපක්‍රමශීලී ය.

මෙය සිදු කිරීම ES2015 වන තෙක් නිශ්චිතව දක්වා නොතිබුණද, එය කොටස්වල ක්‍රියාකාරී ප්‍රකාශන සඳහා සහය දැක්වීමට ඉඩ දිය හැකි දිගුවකි . අවාසනාවට (හා නොවැළැක්විය හැකි ලෙස) විවිධ එන්ජින් විවිධ දේ කළේය.

ES2015 වන විට, පිරිවිතරයන් කුමක් කළ යුතු දැයි පවසයි. ඇත්ත වශයෙන්ම, එය කිරීමට වෙනම කරුණු තුනක් ලබා දෙයි:

  1. වෙබ් බ්‍රව්සරයක නොව ලිහිල් ප්‍රකාරයේදී නම් , ජාවාස්ක්‍රිප්ට් එන්ජිම එක් දෙයක් කළ යුතුය
  2. වෙබ් බ්‍රව්සරයක ලිහිල් ප්‍රකාරයේදී නම්, ජාවාස්ක්‍රිප්ට් එන්ජිම වෙනත් දෙයක් කිරීමට බලාපොරොත්තු වේ
  3. දී නම් දැඩි මාදිලිය (බ්රව්සරය හෝ නැත), JavaScript එන්ජින් දෙයක් තවත් දෙයක් තවමත් ඉටු කළ යුතු වේ

ලිහිල් මාතයන් සඳහා වන නීති උපක්‍රමශීලී ය, නමුත් දැඩි ප්‍රකාරයේදී, කුට්ටි වල ක්‍රියාකාරී ප්‍රකාශ කිරීම පහසු ය: ඒවා බ්ලොක් එකට දේශීය ය (ඒවාට බ්ලොක් විෂය පථය ඇත , එය ES2015 හි ද අළුත් ය), ඒවා ඉහළට ඔසවා ඇත බ්ලොක් එකේ. ඒ නිසා:

"use strict";
if (someCondition) {
    foo();               // Works just fine
    function foo() {
    }
}
console.log(typeof foo); // "undefined" (`foo` is not in scope here
                         // because it's not in the same block)

"නිර්නාමික" functionප්රකාශනය

දෙවන පොදු ස්වරූපය නිර්නාමික ශ්‍රිත ප්‍රකාශනයක් ලෙස හැඳින්වේ :

var y = function () {
    console.log('y');
};

සියලු ප්‍රකාශන මෙන්ම, එය පියවරෙන් පියවර කේතය ක්‍රියාත්මක කිරීමේදී ළඟා වේ.

ES5 හි, මෙය නිර්මාණය කරන ශ්‍රිතයට නමක් නොමැත (එය නිර්නාමිකයි). ES2015 දී, ශ්‍රිතයට හැකි නම් එය සන්දර්භයෙන් අනුමාන කිරීමෙන් නමක් පවරනු ලැබේ. ඉහත උදාහරණයේ දී, නම වනු ඇත y. ශ්‍රිතය දේපල ආරම්භකයකුගේ අගය වන විට සමාන දෙයක් සිදු වේ. (සහ නීති සිදුවූ විට මත විස්තර සඳහා, සෙවීමට SetFunctionNameතුළ ඇති පිරිවිතරයන්  - එය පෙනී පුරා ස්ථානය.)

functionප්‍රකාශනය ලෙස නම් කර ඇත

තෙවන ස්වරූපය නම් කරන ලද ශ්‍රිත ප්‍රකාශනයකි ("NFE"):

var z = function w() {
    console.log('zw')
};

මෙය නිර්මාණය කරන ශ්‍රිතයට නිසි නමක් ඇත ( wමෙම අවස්ථාවේ දී). සියලු ප්‍රකාශන මෙන්, මෙය කේතය පියවරෙන් පියවර ක්‍රියාත්මක කිරීමේදී ළඟා වේ. ප්‍රකාශනය දිස්වන විෂය පථයට ශ්‍රිතයේ නම එකතු නොවේ ; නම වන මෙම උත්සවය තුල ම විෂය පථය තුල:

var z = function w() {
    console.log(typeof w); // "function"
};
console.log(typeof w);     // "undefined"

ජාවාස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීම සඳහා එන්එෆ්ඊ බොහෝ විට දෝෂ ප්‍රභවයක් වී ඇති බව සලකන්න. උදාහරණයක් ලෙස, IE8 සහ ඊට පෙර, NFEs සම්පූර්ණයෙන්ම වැරදි ලෙස හසුරුවන්න , වෙනස් වේලාවන් දෙකකදී වෙනස් කාර්යයන් දෙකක් නිර්මාණය කරයි. සෆාරි හි මුල් සංස්කරණවල ද ගැටළු ඇති විය. ශුභාරංචිය නම්, බ්‍රව්සර් වල වර්තමාන අනුවාදයන් (IE9 සහ ඉහළ, වත්මන් සෆාරි) තවදුරටත් එම ගැටළු නොමැති වීමයි. (නමුත් මෙම ලිවීම අනුව, කනගාටුවට කරුණක් නම්, IE8 පුළුල් ලෙස භාවිතයේ පවතින අතර, එබැවින් පොදුවේ වෙබය සඳහා කේත සමඟ NFE භාවිතා කිරීම තවමත් ගැටළු සහගතය.)

ප්රවේශ කාරක ආරම්භක (ES5 +)

සමහර විට කාර්යයන් බොහෝ දුරට නොදැනුවත්වම ගිලී යා හැකිය; සමග එසේ වන accessor කාර්යයන් . මෙන්න උදාහරණයක්:

var obj = {
    value: 0,
    get f() {
        return this.value;
    },
    set f(v) {
        this.value = v;
    }
};
console.log(obj.f);         // 0
console.log(typeof obj.f);  // "number"

මම ශ්‍රිතය භාවිතා කරන විට, මම භාවිතා නොකළ බව සලකන්න ()! එයට හේතුව එය දේපලකට ප්‍රවේශවීමේ කාර්යයකි . අපි දේපල සාමාන්‍ය ආකාරයෙන් ලබා ගනිමු, නමුත් තිරය පිටුපස, ශ්‍රිතය හැඳින්වේ.

ඔබ ද සමග accessor කාර්යයන් නිර්මාණය කළ හැකි Object.defineProperty, Object.definePropertiesකිරීමට, හා අඩු ප්රකට දෙවන තර්කය Object.create.

ඊතල ක්‍රියාකාරී ප්‍රකාශනය (ES2015 +)

ES2015 අපට ඊතල ශ්‍රිතය ගෙන එයි . මෙන්න එක් උදාහරණයක්:

var a = [1, 2, 3];
var b = a.map(n => n * 2);
console.log(b.join(", ")); // 2, 4, 6

ඇමතුම තුළ n => n * 2සැඟවී ඇති දෙයක් බලන්න map()? ඒක ශ්‍රිතයක්.

ඊතල කාර්යයන් පිළිබඳ කරුණු කිහිපයක්:

  1. ඔවුන්ට ඔවුන්ගේම දෑ නොමැත this. ඒ වෙනුවට, ඔවුන් සමීප පුරා ඇති thisඔවුන් අර්ථ කොහෙද සන්දර්භය ය. (ඔවුන් ද සමීප කට argumentsහා, කොහෙද අදාළ, super.) ඉන් අදහස් වන බව thisඔවුන් තුළ ඇති ලෙස එක ම ය thisඔවුන් නිර්මාණය කරන්නේ, සහ වෙනස් කළ නොහැකි.

  2. ඉහත සඳහන් දෑ සමඟ ඔබ දැක ඇති පරිදි, ඔබ මූලික පදය භාවිතා නොකරයි function; ඒ වෙනුවට, ඔබ භාවිතා කරයි =>.

මෙම n => n * 2ඉහත සඳහන් උදාහරණය ඔවුන් එක් ආකාරයකි. ශ්‍රිතය සම්මත කිරීම සඳහා ඔබට විවිධ තර්ක තිබේ නම්, ඔබ පරෙන්ස් භාවිතා කරයි:

var a = [1, 2, 3];
var b = a.map((n, i) => n * i);
console.log(b.join(", ")); // 0, 2, 6

( Array#mapපළමු තර්කය ලෙස ඇතුළත් කිරීම සහ දෙවන දර්ශකය ලෙස දර්ශකය පසු කරන බව මතක තබා ගන්න .)

අවස්ථා දෙකේදීම, ශ්‍රිතයේ ශරීරය ප්‍රකාශනයක් පමණි; ශ්‍රිතයේ ප්‍රතිලාභ අගය ස්වයංක්‍රීයව එම ප්‍රකාශනයේ ප්‍රති result ලය වනු ඇත (ඔබ පැහැදිලිව භාවිතා නොකරයි return).

ඔබ තනි ප්‍රකාශනයකට වඩා වැඩි යමක් කරන්නේ නම්, භාවිතා කරන්න {}සහ පැහැදිලි කරන්න return(ඔබට වටිනාකමක් ආපසු ලබා දීමට අවශ්‍ය නම්), සාමාන්‍ය පරිදි:

var a = [
  {first: "Joe", last: "Bloggs"},
  {first: "Albert", last: "Bloggs"},
  {first: "Mary", last: "Albright"}
];
a = a.sort((a, b) => {
  var rv = a.last.localeCompare(b.last);
  if (rv === 0) {
    rv = a.first.localeCompare(b.first);
  }
  return rv;
});
console.log(JSON.stringify(a));

නැති අනුවාදය ප්‍රකාශන ශරීරයක් හෝ සංක්ෂිප්ත ශරීරයක්{ ... } සහිත ඊතල ශ්‍රිතයක් ලෙස හැඳින්වේ . (එසේම: සංක්ෂිප්ත ඊතල ශ්‍රිතයකි.) ශරීරය නිර්වචනය කරන තැනැත්තා ක්‍රියාකාරී ශරීරයක් සහිත ඊතල ශ්‍රිතයකි . (එසේම: වාචික ඊතල ශ්‍රිතයක්.){ ... }

වස්තු ආරම්භකයේ ක්‍රම ප්‍රකාශය (ES2015 +)

ක්‍රම නිර්වචනයක් ලෙස හැඳින්වෙන ශ්‍රිතයක් සඳහන් කරන දේපලක් ප්‍රකාශ කිරීමට කෙටි ආකාරයකට ES2015 ඉඩ දෙයි ; එය මේ වගේ ය:

var o = {
    foo() {
    }
};

ES5 හා ඊට පෙර සමාන වේ:

var o = {
    foo: function foo() {
    }
};

වෙනස (වාචිකතාව හැර) ක්‍රමයක් භාවිතා කළ හැකි superනමුත් ශ්‍රිතයකට එය කළ නොහැකිය. උදාහරණයක් ලෙස, ඔබට valueOfක්‍රම සින්ටැක්ස් භාවිතා කරමින් (කියන්න) අර්ථ දක්වා ඇති වස්තුවක් තිබේ නම් , එය super.valueOf()අගය ලබා ගැනීමට භාවිතා කළ හැකිය Object.prototype.valueOf(අනුමාන වශයෙන් එය සමඟ වෙනත් දෙයක් කිරීමට පෙර), නමුත් ඊඑස් 5 අනුවාදය ඒ Object.prototype.valueOf.call(this)වෙනුවට කළ යුතුව ඇත.

ද ක්රමය බව වස්තුව තාවකාලික, එසේ නම්, ඒ සඳහා අර්ථ විය වස්තුව වෙත යොමු කර ඇති අදහස් (උදාහරණයක් ලෙස, ඔබ එය තුලට ගමන් කරන්නේ ඒ Object.assignමූලාශ්රය වස්තූන් ලෙස), ක්රමය කාරක රීති හැකි වස්තුව රඳවා සිටින බව මින් අදහස් මතකයේ හැටියට එය කසළ එකතු කිරීමට ඉඩ තිබුණි (ජාවාස්ක්‍රිප්ට් එන්ජිම එම තත්වය හඳුනාගෙන එය භාවිතා නොකරන්නේ නම් එය හැසිරවිය හැක super).

class(ES2015 +) හි ඉදිකිරීම්කරු සහ ක්‍රම ප්‍රකාශන

classප්‍රකාශිත ඉදිකිරීම්කරුවන් සහ ක්‍රම ඇතුළුව ES2015 අපට සින්ටැක්ස් ගෙන එයි :

class Person {
    constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    getFullName() {
        return this.firstName + " " + this.lastName;
    }
}

ඉහත ශ්‍රිත ප්‍රකාශන දෙකක් ඇත: එකක් ඉදිකිරීම්කරුට, නම ලැබෙන Person, සහ එකක් සඳහා getFullName, පවරා ඇති ශ්‍රිතයකි Person.prototype.


3
එවිට නම wනොසලකා හරිනු ලැබේද?
BiAiB

8
ElPellePenna: ක්‍රියාකාරී නම් බොහෝ දේ සඳහා ප්‍රයෝජනවත් වේ. මගේ දෘෂ්ටියේ ඇති ලොකුම කරුණු දෙක වන්නේ පුනරාවර්තනය වන අතර, ශ්‍රිතයේ නම ඇමතුම් තොග, ව්‍යතිරේක හෝඩුවාවන් සහ එවැනි ය.
ටී. ජේ. ක්‍රෝඩර්

4
Ha චයිම් එලියා - "පිළිගැනීම එයින් හොඳම පිළිතුර නොවේ, එයින් අදහස් කරන්නේ එය ඉල්ලූ පුද්ගලයා වෙනුවෙන් වැඩ කළ බවයි." මූලාශ්‍රය
ScrapCode

6
@AR: ඇත්ත. විනෝදජනක ලෙස, ඊට ඉහළින් එය පවසන්නේ “හොඳම පිළිතුරු පළමුව පෙන්වන්නේ එවිට ඒවා සැමවිටම පහසුවෙන් සොයාගත හැකි” බවයි. පිළිගත් පිළිතුර පළමුවෙන්ම වැඩි ඡන්ද ප්‍රතිශතයක් පෙන්වන බැවින්, සංචාරය තරමක් ස්වයං-පරස්පර විරෝධී විය හැකිය. ;-) එසේම තරමක් සාවද්‍ය, අපි ඡන්දයෙන් "හොඳම" යැයි තීරණය කළහොත් (එය විශ්වාසදායක නොවේ, එය අපට ලැබී ඇති දෙයයි), "හොඳම" පිළිතුරු පළමුව පෙන්වන්නේ ඔබ "ඡන්ද" පටිත්ත භාවිතා කරන්නේ නම් පමණි. - එසේ නොමැති නම්, පළමුවෙන්ම පිළිතුරු සක්‍රිය හෝ පැරණිතම පිළිතුරු වේ.
ටී. ජේ. ක්‍රෝඩර්

1
JTJCrowder: එකඟ විය. 'දිනය අනුව පිළිවෙලට' සමහර විට කරදරකාරී වේ.
ScrapCode

145

ගෝලීය සන්දර්භය ගැන කථා කරන විට, varප්‍රකාශය සහ FunctionDeclarationඅවසානයේ දී ගෝලීය වස්තුව මත මකා දැමිය නොහැකි දේපලක් නිර්මාණය වනු ඇත , නමුත් දෙකෙහිම වටිනාකම නැවත ලිවිය හැකිය .

ක්‍රම දෙක අතර ඇති සියුම් වෙනස නම්, විචල්‍ය ස්ථාපන ක්‍රියාවලිය ක්‍රියාත්මක වන විට (සත්‍ය කේත ක්‍රියාත්මක කිරීමට පෙර) ප්‍රකාශයට පත් කරන ලද සියලුම හඳුනාගැනීම් ආරම්භ varකරනු ඇති අතර undefined, FunctionDeclarationඒ මොහොතේ සිට භාවිතා කරන ඒවා ලබා ගත හැකිය, උදාහරණයක් ලෙස:

 alert(typeof foo); // 'function', it's already available
 alert(typeof bar); // 'undefined'
 function foo () {}
 var bar = function () {};
 alert(typeof bar); // 'function'

bar FunctionExpressionධාවන කාලය පැවරීම ක්‍රියාත්මක වන තෙක් සිදු වේ.

A විසින් නිර්මාණය කරන ලද ගෝලීය දේපලක් FunctionDeclarationවිචල්‍ය අගයක් වැනි කිසිදු ගැටළුවක් නොමැතිව නැවත ලිවිය හැකිය, උදා:

 function test () {}
 test = null;

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

ඔබගේ සංස්කරණය කරන ලද පළමු උදාහරණය ( foo = function() { alert('hello!'); };) ගැන, එය ප්‍රකාශයට පත් නොකළ පැවරුමකි, සෑම විටම varමූලික පදය භාවිතා කිරීමට මම ඔබව උනන්දු කරවන්නෙමි.

පැවරුමක් සමඟ, varප්‍රකාශයක් නොමැතිව , යොමු කරන ලද අනන්‍යතාවය විෂය පථයේ සොයාගත නොහැකි නම්, එය ගෝලීය වස්තුවේ මකා දැමිය හැකි දේපලක් බවට පත්වේ .

එසේම, ප්‍රකාශයට පත් නොකළ පැවරුම් දැඩි ප්‍රකාරයReferenceError යටතේ ECMAScript 5 මතට විසි කරයි .

කියවිය යුතුම:

සටහන : මෙම පිළිතුර වෙනත් ප්‍රශ්නයකින් ඒකාබද්ධ කර ඇති අතර, OP හි ප්‍රධාන සැකය හා වැරදි වැටහීම වූයේ, ඒ සමඟ ප්‍රකාශයට පත් කරන ලද හඳුනාගැනීම් FunctionDeclarationනැවත ලිවිය නොහැකි බවය.


ජාවාස්ක්‍රිප්ට් හි කාර්යයන් නැවත ලිවිය හැකි බව මා දැන සිටියේ නැත! එසේම, එම විග්‍රහ ඇණවුම මට විශාල විකුණුම් ස්ථානයක් වේ. මම කාර්යයන් නිර්මාණය කරන ආකාරය නැරඹිය යුතු යැයි මම සිතමි.
Xeoncross

2
400ing වන බැවින් "නම් ශ්‍රිත ප්‍රකාශන අවලංගු කරන ලද" ලිපියට +0 කරන්න. විය හැකි කැඩපත?: Kangax.github.com/nfe
Mr_Chimp

@ සීඑම්එස් හොඳයි. මතක තබා ගන්න මම කවදාවත් මුල් පිටපත දැක නැති නිසා එය කැඩපතක් ද නැතිනම් එකම මාතෘකාවක් සහිත තවත් ලිපියක් ද යන්න මම නොදනිමි!
Mr_Chimp

RMr_Chimp මට හොඳටම විශ්වාසයි, thewaybackmachine කියන්නේ එයට බඩගා යන වේලාවට 302 ක් ලැබී ඇති බවත් නැවත හරවා යැවීම ඔබ ලබා දුන් සබැඳියට බවයි.
ජෝන්

125

ඔබ එහි පළ කර ඇති කේත ස්නිපෙට් දෙක, සෑම අරමුණක් සඳහාම එකම ආකාරයකින් හැසිරෙනු ඇත.

කෙසේ වෙතත්, හැසිරීමේ වෙනස නම් පළමු ප්‍රභේදය ( var functionOne = function() {}) සමඟ එම ශ්‍රිතය හැඳින්විය හැක්කේ කේතයේ එම ලක්ෂ්‍යයෙන් පසුව පමණි.

දෙවන ප්‍රභේදය ( function functionTwo()) සමඟ, ශ්‍රිතය ප්‍රකාශිත ස්ථානයට ඉහළින් දිවෙන කේතයට ශ්‍රිතය ලබා ගත හැකිය.

මෙයට හේතුව පළමු ප්‍රභේදය සමඟ ක්‍රියාකාරීත්වය විචල්‍යයට fooධාවන වේලාවට පැවරීමයි . fooදෙවැන්නෙහි, විග්‍රහ කරන වේලාවේදී එම අනන්‍යතාවයට ශ්‍රිතය පවරනු ලැබේ .

තවත් තාක්ෂණික තොරතුරු

කාර්යයන් අර්ථ දැක්වීමේ ක්‍රම තුනක් ජාවාස්ක්‍රිප්ට් සතුව ඇත.

  1. ඔබගේ පළමු ස්නිපටයේ ක්‍රියාකාරී ප්‍රකාශනයක් පෙන්වයි . ශ්‍රිතයක් නිර්මාණය කිරීම සඳහා “ශ්‍රිත” ක්‍රියාකරු භාවිතා කිරීම මෙයට සම්බන්ධ වේ - එම ක්‍රියාකරුගේ ප්‍රති result ලය ඕනෑම විචල්‍ය හෝ වස්තු දේපලක ගබඩා කළ හැකිය. ශ්‍රිත ප්‍රකාශනය ඒ ආකාරයෙන් බලවත් ය. ශ්‍රිත ප්‍රකාශනය බොහෝ විට "නිර්නාමික ශ්‍රිතයක්" ලෙස හැඳින්වේ, එයට නමක් නොමැති නිසා,
  2. ඔබේ දෙවන උදාහරණය ශ්‍රිත ප්‍රකාශයකි . මෙය ශ්‍රිතයක් නිර්මාණය කිරීම සඳහා "ශ්‍රිතය" ප්‍රකාශය භාවිතා කරයි . ශ්‍රිතය විග්‍රහ කරන වේලාවට ලබා දී ඇති අතර එම විෂය පථයේ ඕනෑම තැනක කැඳවිය හැකිය. ඔබට එය පසුව විචල්‍ය හෝ වස්තු දේපලක ගබඩා කළ හැකිය.
  3. ශ්‍රිතයක් නිර්වචනය කිරීමේ තුන්වන ක්‍රමය වන්නේ “ශ්‍රිතය ()” ඉදිකිරීම්කරු වන අතර එය ඔබේ මුල් පෝස්ට් එකේ නොපෙන්වයි. eval()එහි ගැටළු ඇති ආකාරයටම ක්‍රියාත්මක වන බැවින් මෙය භාවිතා කිරීම රෙකමදාරු කරනු නොලැබේ .

104

ග්‍රෙග්ගේ පිළිතුරට වඩා හොඳ පැහැදිලි කිරීමක්

functionTwo();
function functionTwo() {
}

වරදක් නැත්තේ ඇයි? ප්‍රකාශන සෑම විටම ඉහළ සිට පහළට ක්‍රියාත්මක වන බව අපට නිතරම උගන්වා ඇත (??)

නිසා:

ක්‍රියාකාරී ප්‍රකාශන සහ විචල්‍ය ප්‍රකාශන සෑම විටම ( hoisted) නොපෙනෙන ලෙස ජාවාස්ක්‍රිප්ට් පරිවර්ථකයා විසින් ඒවායේ අඩංගු විෂය පථයේ ඉහළට ගෙන යනු ලැබේ . ක්‍රියාකාරී පරාමිතීන් සහ භාෂාව නිර්වචනය කළ නම්, පැහැදිලිවම, දැනටමත් තිබේ. බෙන් චෙරි

මෙයින් අදහස් කරන්නේ මේ වගේ කේතය:

functionOne();                  ---------------      var functionOne;
                                | is actually |      functionOne();
var functionOne = function(){   | interpreted |-->
};                              |    like     |      functionOne = function(){
                                ---------------      };

ප්‍රකාශනවල පැවරුම් කොටස ඔසවා නැති බව සැලකිල්ලට ගන්න. නම පමණක් ඔසවා ඇත.

නමුත් ශ්‍රිත ප්‍රකාශන වලදී, සමස්ත ක්‍රියාකාරී ශරීරයද ඔසවනු ලැබේ :

functionTwo();              ---------------      function functionTwo() {
                            | is actually |      };
function functionTwo() {    | interpreted |-->
}                           |    like     |      functionTwo();
                            ---------------

ක්‍රියාකාරී මාතෘකාව පිළිබඳ පැහැදිලි තොරතුරු සඳහා HI සුහයිල් ස්තූතියි. දැන් මගේ ප්‍රශ්නය වන්නේ විචල්‍ය ප්‍රකාශනය (functionOne) හෝ ශ්‍රිත ප්‍රකාශනය (functionTwo) වේවා ප්‍රකාශන ධූරාවලියෙහි පළමු ප්‍රකාශය වන්නේ කවරේද යන්නයි.
ෂරති ආර් බී

91

අනෙක් විචාරකයින් දැනටමත් ඉහත ප්‍රභේද දෙකේ අර්ථකථන වෙනස ආවරණය කර ඇත. ශෛලීය වෙනසක් සටහන් කිරීමට මට අවශ්‍ය විය: වෙනත් වස්තුවක දේපලක් සැකසිය හැක්කේ "පැවරුම්" විචල්‍යතාවයට පමණි.

මම බොහෝ විට මෙවැනි රටාවක් සමඟ ජාවාස්ක්‍රිප්ට් මොඩියුල සාදමි:

(function(){
    var exports = {};

    function privateUtil() {
            ...
    }

    exports.publicUtil = function() {
            ...
    };

    return exports;
})();

මෙම රටාව සමඟ, ඔබේ පොදු කාර්යයන් සියල්ලම පැවරුම් භාවිතා කරන අතර ඔබේ පුද්ගලික කාර්යයන් ප්‍රකාශනය භාවිතා කරයි.

(ප්‍රකාශය තහනම් කරන අතරම පැවරුමට අර්ධ සළකුණක් අවශ්‍ය බව සලකන්න.)


4
yuiblog.com/blog/2007/06/12/module-pattern යනු මට කිව හැකි තාක් දුරට මොඩියුල රටාව සඳහා වන මූලික සඳහනයි . (එම ලිපිය var foo = function(){...}පුද්ගලික විචල්‍යයන් සඳහා පවා වාක්‍ය ඛණ්ඩය භාවිතා කරයි .
ෂෝන් මැක්මිලන්

IE හි සමහර පැරණි අනුවාද වල මෙය සම්පූර්ණයෙන්ම සත්‍ය නොවේ. ( function window.onload() {}දෙයක් විය.)
රයි-

77

පළමු ක්‍රමයට දෙවන ක්‍රමයට වැඩි කැමැත්තක් දැක්විය යුත්තේ කවදාද යන්න පිළිබඳ නිදර්ශනයකි.

සමඟ

if (condition){
    function myfunction(){
        // Some code
    }
}

, මෙම අර්ථ දැක්වීම myfunctionපෙර අර්ථ දැක්වීම් අභිබවා යනු ඇත, මන්ද එය විග්‍රහ කරන වේලාවේදී සිදු වේ.

අතර

if (condition){
    var myfunction = function (){
        // Some code
    }
}

අර්ථ දැක්වීමේ නිවැරදි කාර්යය ඉටු කළ myfunctionවිට පමණි condition.


1
මෙම උදාහරණය හොඳ වන අතර එය පරිපූර්ණත්වයට ආසන්න නමුත් වැඩිදියුණු කළ හැකිය. වඩා හොඳ උදාහරණය වනුයේ var myFunc = null;ලූපයකින් පිටත හෝ if / elseif / වෙනත් බ්ලොක් එකකින් පිටත අර්ථ දැක්වීමයි. එවිට ඔබට එකම විචල්‍යයට විවිධ කාර්යයන් කොන්දේසි සහිතව පැවරිය හැකිය. JS හි, නැතිවූ අගයක් ශුන්‍යයට, පසුව නිර්වචනය නොකිරීමට වඩා හොඳ සම්මුතියකි. එමනිසා, ඔබ මුලින්ම මගේ ක්‍රියාකාරිත්වය ශුන්‍ය ලෙස ප්‍රකාශ කළ යුතු අතර පසුව එය කොන්දේසි සහිතව පවරන්න.
ඇලෙක්සැන්ඩර් මිල්ස්

62

වැදගත් හේතුවක් වන්නේ ඔබේ නාම අවකාශයේ “මූල” ලෙස එක් හා එකම විචල්‍යයක් එක් කිරීමයි ...

var MyNamespace = {}
MyNamespace.foo= function() {

}

හෝ

var MyNamespace = {
  foo: function() {
  },
  ...
}

නාම අවකාශය සඳහා බොහෝ ශිල්පීය ක්‍රම තිබේ. ජාවාස්ක්‍රිප්ට් මොඩියුල රාශියක් තිබීමත් සමඟ එය වඩාත් වැදගත් වේ.

ද බලන්න මම JavaScript දී නාම ප්රකාශ කරන්නේ කෙසේද?


3
මෙම පිළිතුර වෙනත් ප්‍රශ්නයකින් මෙම ප්‍රශ්නයට ඒකාබද්ධ වී ඇති බව පෙනේ , සහ වචන මෙම ප්‍රශ්නයට සම්බන්ධ නැති ඉතා කුඩා බවක් පෙනේ . මෙම ප්‍රශ්නය වඩාත් නිශ්චිතවම යොමු කර ඇති බවක් පෙනෙන පරිදි පිළිතුර සංස්කරණය කිරීම ගැන ඔබ සිතනවාද? (නැවත අවධාරණය කිරීමට; මෙය කිසිසේත්ම ඔබේ වරදක් නොවේ ... ඒකාබද්ධ කළ ප්‍රශ්නයක අතුරු ආබාධයක් පමණි). ඔබට එය මකා දැමිය හැකි අතර, මම හිතන්නේ ඔබ ඔබේ කීර්ති නාමය රඳවා ගනු ඇත. නැතහොත් ඔබට එය අත්හැරිය හැකිය; එය පැරණි බැවින් එය විශාල වෙනසක් නොකරනු ඇත.
ඇන්ඩ rew බාබර්

55

එසවීම යනු ජාවාස්ක්‍රිප්ට් පරිවර්තකයාගේ සියලු විචල්‍ය හා ක්‍රියාකාරී ප්‍රකාශන වත්මන් විෂය පථයේ ඉහළට ගෙන යාමයි.

කෙසේ වෙතත්, සත්‍ය ප්‍රකාශන පමණක් ඔසවා ඇත. පැවරුම් ඔවුන් සිටින තැන තැබීමෙන්.

  • පිටුව තුළ ප්‍රකාශයට පත් කරන ලද විචල්‍ය / ක්‍රියාකාරිත්වය ගෝලීය වන අතර එම පිටුවෙහි ඕනෑම තැනකට ප්‍රවේශ විය හැකිය.
  • ශ්‍රිතය තුළ ප්‍රකාශිත විචල්‍ය / කාර්යයන් දේශීය විෂය පථයක් ඇත. එයින් අදහස් වන්නේ ඒවා ක්‍රියාකාරී ශරීරය තුළ (විෂය පථය) ලබා ගත හැකි / ප්‍රවේශ කළ හැකි ඒවා ක්‍රියාකාරී ශරීරයෙන් පිටත ලබා ගත නොහැකි බවයි.

විචල්ය

ජාවාස්ක්‍රිප්ට් ලිහිල් ලෙස ටයිප් කළ භාෂාව ලෙස හැඳින්වේ. එයින් අදහස් වන්නේ ජාවාස්ක්‍රිප්ට් විචල්‍යයන්ට ඕනෑම දත්ත වර්ගයක වටිනාකම රඳවා ගත හැකි බවයි. ධාවන කාලය තුළ ලබා දී ඇති අගය / වචනාර්ථය මත පදනම්ව විචල්ය වර්ගය වෙනස් කිරීමට ජාවාස්ක්‍රිප්ට් ස්වයංක්‍රීයව බලා ගනී.

global_Page = 10;                                               var global_Page;      « undefined
    « Integer literal, Number Type.   -------------------       global_Page = 10;     « Number         
global_Page = 'Yash';                 |   Interpreted   |       global_Page = 'Yash'; « String
    « String literal, String Type.    «       AS        «       global_Page = true;   « Boolean 
var global_Page = true;               |                 |       global_Page = function (){          « function
    « Boolean Type                    -------------------                 var local_functionblock;  « undefined
global_Page = function (){                                                local_functionblock = 777 Number
    var local_functionblock = 777;                              };  
    // Assigning function as a data.
};  

ක්රියාකාරිත්වය

function Identifier_opt ( FormalParameterList_opt ) { 
      FunctionBody | sequence of statements

      « return;  Default undefined
      « return 'some data';
}
  • පිටුව තුළ ප්‍රකාශිත කාර්යයන් ගෝලීය ප්‍රවේශය ඇති පිටුවේ ඉහළට ඔසවනු ලැබේ.
  • ශ්‍රිත-බ්ලොක් තුළ ප්‍රකාශිත ශ්‍රිතයන් බ්ලොක් එකට ඉහළට ඔසවනු ලැබේ.
  • ශ්‍රිතයේ පෙරනිමි ප්‍රතිලාභ අගය ' නිර්වචනය නොකළ ', විචල්‍ය ප්‍රකාශන පෙරනිමි අගය 'නිර්වචනය නොකළ'

    Scope with respect to function-block global. 
    Scope with respect to page undefined | not available.

කාර්ය ප්‍රකාශනය

function globalAccess() {                                  function globalAccess() {      
}                                  -------------------     }
globalAccess();                    |                 |     function globalAccess() { « Re-Defined / overridden.
localAccess();                     «   Hoisted  As   «         function localAccess() {
function globalAccess() {          |                 |         }
     localAccess();                -------------------         localAccess(); « function accessed with in globalAccess() only.
     function localAccess() {                              }
     }                                                     globalAccess();
}                                                          localAccess(); « ReferenceError as the function is not defined

ක්‍රියාකාරී ප්‍රකාශනය

        10;                 « literal
       (10);                « Expression                (10).toString() -> '10'
var a;                      
    a = 10;                 « Expression var              a.toString()  -> '10'
(function invoke() {        « Expression Function
 console.log('Self Invoking');                      (function () {
});                                                               }) () -> 'Self Invoking'

var f; 
    f = function (){        « Expression var Function
    console.log('var Function');                                   f ()  -> 'var Function'
    };

විචල්යයට පවරා ඇති කාර්යය උදාහරණය:

(function selfExecuting(){
    console.log('IIFE - Immediately-Invoked Function Expression');
}());

var anonymous = function (){
    console.log('anonymous function Expression');
};

var namedExpression = function for_InternalUSE(fact){
    if(fact === 1){
        return 1;
    }

    var localExpression = function(){
        console.log('Local to the parent Function Scope');
    };
    globalExpression = function(){ 
        console.log('creates a new global variable, then assigned this function.');
    };

    //return; //undefined.
    return fact * for_InternalUSE( fact - 1);   
};

namedExpression();
globalExpression();

javascript ලෙස අර්ථකථනය කර ඇත

var anonymous;
var namedExpression;
var globalExpression;

anonymous = function (){
    console.log('anonymous function Expression');
};

namedExpression = function for_InternalUSE(fact){
    var localExpression;

    if(fact === 1){
        return 1;
    }
    localExpression = function(){
        console.log('Local to the parent Function Scope');
    };
    globalExpression = function(){ 
        console.log('creates a new global variable, then assigned this function.');
    };

    return fact * for_InternalUSE( fact - 1);    // DEFAULT UNDEFINED.
};

namedExpression(10);
globalExpression();

විවිධ බ්‍රව්සර භාවිතයෙන් ඔබට ක්‍රියාකාරී ප්‍රකාශනය, ප්‍රකාශන පරීක්ෂණය පරීක්ෂා කළ හැකිය jsperf Test Runner


ES5 ඉදිකිරීම්කරු පන්ති පන්ති : Function.prototype.bind භාවිතයෙන් සාදන ලද ක්‍රියාකාරී වස්තු

JavaScript මඟින් කාර්යයන් පළමු පන්තියේ වස්තු ලෙස සලකයි, එබැවින් වස්තුවක් වීම නිසා ඔබට ශ්‍රිතයකට ගුණාංග පැවරිය හැකිය.

function Shape(id) { // Function Declaration
    this.id = id;
};
    // Adding a prototyped method to a function.
    Shape.prototype.getID = function () {
        return this.id;
    };
    Shape.prototype.setID = function ( id ) {
        this.id = id;
    };

var expFn = Shape; // Function Expression

var funObj = new Shape( ); // Function Object
funObj.hasOwnProperty('prototype'); // false
funObj.setID( 10 );
console.log( funObj.getID() ); // 10

ඊඑස් 6 හඳුන්වා දුන් ඊතල ශ්‍රිතය : ඊතල ශ්‍රිත ප්‍රකාශනයකට කෙටි වාක්‍ය ඛණ්ඩයක් ඇත, ඒවා ක්‍රම නොවන කාර්යයන් සඳහා වඩාත් සුදුසු වන අතර ඒවා ඉදිකිරීම්කරුවන් ලෙස භාවිතා කළ නොහැක.

ArrowFunction : ArrowParameters => ConciseBody.

const fn = (item) => { return item & 1 ? 'Odd' : 'Even'; };
console.log( fn(2) ); // Even
console.log( fn(3) ); // Odd

3
අහ්, ඔබේ පිළිතුර ... එය අපැහැදිලි නොවේද? හොඳින් ලියා ඇති නමුත් අධික තොරතුරු වියදම් කිරීම සහ ලිවීම සඳහා +1.
ඩෙන්මාර්ක

40

අනෙක් සියල්ලන්ම ඔසවන කොටස හොඳින් ආවරණය කර ඇති නිසා මම මගේම පිළිතුරක් එක් කරමි.

දීර් time කාලයක් තිස්සේ වඩා හොඳ කුමන මාර්ගය ගැන මම කල්පනා කර ඇත්තෙමි, http://jsperf.com ට ස්තූතියි දැන් මම දනිමි :)

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ක්‍රියාකාරී ප්‍රකාශන වේගවත් වන අතර, වෙබ් ඩිව් හි ඇත්ත වශයෙන්ම වැදගත් වන්නේ එයද? ;)


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

3
හොඳයි, මම එය ෆයර්ෆොක්ස් සමඟ වෙනත් ආකාරයකින් සොයා ගත්තා. jsperf.com/sandytest
සන්දීප් නායක

යාවත්කාලීනයක්, මම දැන් ජාවාස්ක්‍රිප්ට් හි සම්පූර්ණ ක්‍රියාකාරී ක්‍රමලේඛ ශෛලියට ගොස් ඇති බැවින්, මම කිසි විටෙක ප්‍රකාශන භාවිතා නොකරමි, ක්‍රියාකාරී ප්‍රකාශන පමණක් වන බැවින් මගේ ශ්‍රිතයන් ඒවායේ විචල්‍ය නම් වලින් දම්වැල් කර ඇමතිය හැකිය. රාම්ඩා ජේඑස් පරීක්ෂා කරන්න ...
ලියොන් ගබාන්

1
AndSandeepNayak මම ඔබේම පරීක්‍ෂණයක් ෆයර්ෆොක්ස් 50.0.0 / වින්ඩෝස් 7 0.0.0 හි ධාවනය කරමි, එය ඇත්ත වශයෙන්ම ලියොන් මෙන් ම ය. එබැවින් ඔබගේ පරීක්ෂණය නිවැරදි නම්, මම නිගමනය කරන්නේ jsperf හි පරීක්ෂණ ඇඟවුම් නොවන අතර, ඒ සියල්ල ඔබගේ බ්‍රව්සරය සහ / හෝ OS අනුවාදය මත රඳා පවතී, හෝ එම මොහොතේ වර්තමාන යන්ත්‍රයේ විශේෂිත තත්වය මත ය.
ocramot

33

බන්ධනය ස්ථාපිත වූ පසු ශ්‍රිත ප්‍රකාශයක් සහ විචල්‍යයකට පවරා ඇති ශ්‍රිත ප්‍රකාශනය සමාන වේ.

කෙසේ වෙතත් ශ්‍රිත වස්තුව සත්‍ය වශයෙන්ම එහි විචල්‍යය සමඟ සම්බන්ධ වන්නේ කෙසේද සහ කවදාද යන්නෙහි වෙනසක් ඇත. මෙම වෙනසට හේතුව ජාවාස්ක්‍රිප්ට් හි විචල්‍ය එසවීම නම් යාන්ත්‍රණයයි .

මූලික වශයෙන්, සියලු ශ්‍රිත ප්‍රකාශන සහ විචල්‍ය ප්‍රකාශයන් ප්‍රකාශය සිදුවන ශ්‍රිතයේ ඉහළට ඔසවා ඇත (ජාවාස්ක්‍රිප්ට් හි ක්‍රියාකාරී විෂය පථය ඇති බව අපි කියන්නේ මේ නිසා ය ).

  • ශ්‍රිත ප්‍රකාශයක් එසවූ විට, ශ්‍රිත ශරීරය “අනුගමනය කරයි” එබැවින් ශ්‍රිත ශරීරය තක්සේරු කළ විට විචල්‍යය වහාම ශ්‍රිත වස්තුවකට බැඳී ඇත.

  • විචල්ය ප්රකාශ එසවීම විට, ආරම්භය වන්නේ නැහැ අනුගමනය, නමුත් "ඉතිරි" වී ඇත. undefinedශ්‍රිතය ශරීරයේ ආරම්භයේදීම විචල්‍යය ආරම්භ කර ඇති අතර කේතයේ එහි මුල් ස්ථානයේ අගයක් පවරනු ලැබේ . (ඇත්ත වශයෙන්ම, එකම නමක් සහිත විචල්‍යයක් ප්‍රකාශ වන සෑම ස්ථානයකම එයට අගයක් පවරනු ලැබේ.)

එසවීමේ අනුපිළිවෙල ද වැදගත් ය: ශ්‍රිත ප්‍රකාශන එකම නමක් සහිත විචල්‍ය ප්‍රකාශයන්ට වඩා ප්‍රමුඛත්වය ගනී, සහ අවසාන ශ්‍රිත ප්‍රකාශනය එකම නමක් සහිත පෙර ශ්‍රිත ප්‍රකාශයන්ට වඩා ප්‍රමුඛත්වය ගනී.

උදාහරණ කිහිපයක් ...

var foo = 1;
function bar() {
  if (!foo) {
    var foo = 10 }
  return foo; }
bar() // 10

විචල්ය foo, ශ්රිතය මුදුනට එසවීම සඳහා ආරම්භනය undefined, එසේ බව !footrue, ඒ නිසා fooනියම වේ 10. මෙම fooපිටත barගේ විෂය පථය කිසිදු භූමිකාව අත තියන්නේ නැත.

function f() {
  return a; 
  function a() {return 1}; 
  var a = 4;
  function a() {return 2}}
f()() // 2

function f() {
  return a;
  var a = 4;
  function a() {return 1};
  function a() {return 2}}
f()() // 2

ක්‍රියාකාරී ප්‍රකාශයන් විචල්‍ය ප්‍රකාශයන්ට වඩා ප්‍රමුඛස්ථානය ගන්නා අතර අවසාන ශ්‍රිත ප්‍රකාශය “සැරයටි” වේ.

function f() {
  var a = 4;
  function a() {return 1}; 
  function a() {return 2}; 
  return a; }
f() // 4

මෙම උදාහරණයේ aදී දෙවන ශ්‍රිත ප්‍රකාශය ඇගයීමේ ප්‍රති function ලයක් ලෙස ශ්‍රිත වස්තුව සමඟ ආරම්භ කර පසුව පවරනු 4ලැබේ.

var a = 1;
function b() {
  a = 10;
  return;
  function a() {}}
b();
a // 1

මෙහිදී ශ්‍රිත ප්‍රකාශය පළමුව ඔසවා විචල්‍යය ප්‍රකාශ කිරීම හා ආරම්භ කිරීම සිදු aකරයි. ඊළඟට, මෙම විචල්‍යය පවරා 10ඇත. වෙනත් වචන වලින් කිවහොත්: පැවරුම බාහිර විචල්‍යයට පවරන්නේ නැත a.


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

1
විශිෂ්ට තනතුර. 'ස්වයං-ක්‍රියාත්මක කිරීමේ ශ්‍රිතයක්' හෝ 'වහාම ක්‍රියාත්මක කරන ලද ක්‍රියාකාරී ප්‍රකාශනයක්' බැලීමට තරම් පහසු විය යුතු අතර ඔහුගේ ශෛලියේ මනාපය ඔහුගේ තනතුරෙන් ract ත් නොවිය යුතුය - එය නිවැරදි වන අතර 'එසවීම' පරිපූර්ණ ලෙස සාරාංශ කරයි. +1
රිකල්සින්

32

පළමු උදාහරණය ශ්‍රිත ප්‍රකාශයකි:

function abc(){}

දෙවන උදාහරණය ශ්‍රිත ප්‍රකාශනයකි:

var abc = function() {};

ප්රධාන වෙනස වන්නේ ඒවා ඔසවන ආකාරය (ඔසවා ප්රකාශයට පත් කිරීමයි). පළමු උදාහරණයේ දී, සම්පූර්ණ ශ්‍රිත ප්‍රකාශය ඔසවා ඇත. දෙවන උදාහරණයේ දී var 'abc' පමණක් ඔසවා ඇති අතර, එහි අගය (ශ්‍රිතය) නිර්වචනය නොකෙරේ, සහ ශ්‍රිතය එය ප්‍රකාශිත ස්ථානයේ පවතී.

සරලව කිවහොත්:

//this will work
abc(param);
function abc(){}

//this would fail
abc(param);
var abc = function() {}

මෙම මාතෘකාව පිළිබඳ වැඩිදුර හැදෑරීම සඳහා මම ඔබට මෙම සබැඳිය තරයේ නිර්දේශ කරමි


1
ඔබේ උදාහරණය ඉහළ පිළිතුරට සමාන ය
GôTô

මෙම පිළිතුර පළ කිරීමට ප්‍රධාන හේතුව වූයේ පතුලේ ඇති සබැඳිය සැපයීමයි. ඉහත ප්‍රශ්නය මට සම්පූර්ණයෙන් වටහා ගැනීමට නොහැකි වූ කොටස මෙයයි.
sla55er

1
ඔබට සබැඳිය බෙදා ගැනීමට අවශ්‍ය වීම ඉතා සිසිල් ය. SO හි අතිරේක තොරතුරු සඳහා සබැඳියන් ප්‍රශ්නය හෝ ඔබේ ප්‍රියතම පිළිතුර පිළිබඳ අදහස් දැක්වීමක් විය යුතුය. දිගින් දිගට සංකීර්ණ තොරතුරු සහිත පිටුවක් නැවත නැවතත් තොරතුරු සහිතව අවුල් කිරීම ඉතා ප්‍රයෝජනවත් වේ. නැත, සබැඳිය සැපයීම සඳහා ඔබට නියෝජිත ලකුණු නොලැබෙනු ඇත, නමුත් ඔබ ප්‍රජාවට උදව් කරනු ඇත.
XML

31

කේත නඩත්තු පිරිවැය අනුව, නම් කරන ලද කාර්යයන් වඩාත් යෝග්‍ය වේ:

  • ඒවා ප්‍රකාශයට පත් කළ ස්ථානයෙන් ස්වාධීන වේ (නමුත් තවමත් විෂය පථයෙන් සීමා වේ).
  • කොන්දේසි සහිත ආරම්භ කිරීම වැනි වැරදි වලට වඩා ප්‍රතිරෝධී වේ (ඔබට අවශ්‍ය නම් එය ඉක්මවා යා හැක).
  • විෂය පථයේ ක්‍රියාකාරීත්වයට වෙන වෙනම දේශීය කාර්යයන් වෙන් කිරීමෙන් කේතය වඩාත් කියවිය හැකිය. සාමාන්‍යයෙන් විෂය පථය තුළ ක්‍රියාකාරීත්වය පළමුව ඉදිරියට යන අතර ඉන් පසුව දේශීය ශ්‍රිත ප්‍රකාශ කිරීම සිදු වේ.
  • නිදොස්කරණයක දී ඔබට "නිර්නාමික / ඇගයීමට ලක් කළ" ශ්‍රිතයක් වෙනුවට ඇමතුම් තොගයේ ක්‍රියාකාරී නාමය පැහැදිලිව පෙනෙනු ඇත.

නම් කරන ලද කාර්යයන් සඳහා තවත් PROS අනුගමනය කරනු ඇතැයි මම සැක කරමි. නම් කරන ලද ශ්‍රිතවල වාසියක් ලෙස ලැයිස්තුගත කර ඇති දේ නිර්නාමික අයට අවාසියකි.

Ically තිහාසිකව, නිර්නාමික කාර්යයන් පෙනී ගියේ නම් කරන ලද කාර්යයන් සහිත සාමාජිකයින් ලැයිස්තුගත කිරීමට භාෂාවක් ලෙස ජාවාස්ක්‍රිප්ට් හි ඇති නොහැකියාවෙනි:

{
    member:function() { /* How do I make "this.member" a named function? */
    }
}

2
තහවුරු කිරීම සඳහා පරීක්ෂණ තිබේ: blog.firsov.net/2010/01/… JS කාර්ය සාධන පරීක්ෂණය - විෂය පථය සහ නම් කරන ලද කාර්යයන් - විශ්ලේෂණ
සාෂා ෆර්සොව්

25

පරිගණක විද්‍යාව අනුව, අපි කතා කරන්නේ නිර්නාමික කාර්යයන් සහ නම් කරන ලද කාර්යයන් ගැන ය. මම හිතන්නේ වඩාත්ම වැදගත් වෙනස නම් නිර්නාමික ශ්‍රිතයක් නමකට බැඳී නැති නිසා නම නිර්නාමික ශ්‍රිතයයි. ජාවාස්ක්‍රිප්ට් හි එය පළමු පන්තියේ වස්තුවකි.

නිර්නාමික කාර්යයන් සහ ලැම්බඩා කැල්කියුලස් පිළිබඳ වැඩි විස්තර සඳහා විකිපීඩියාව හොඳ ආරම්භයකි ( http://en.wikipedia.org/wiki/Anonymous_function ).


ES2015 වන විට (ඔබගේ පිළිතුර පළ කිරීමෙන් වසර හයහමාරකට පසු), ප්‍රශ්නයේ කාර්යයන් දෙකම නම් කර ඇත.
ටී. ජේ. ක්‍රෝඩර්

25

මම මගේ කේතයේ විචල්‍ය ප්‍රවේශය භාවිතා කරන්නේ ඉතා නිශ්චිත හේතුවක් නිසාය, එම න්‍යාය ඉහත වියුක්ත ආකාරයකින් ආවරණය කර ඇත, නමුත් නිදසුනක් මා වැනි සමහර අයට සීමිත ජාවාස්ක්‍රිප්ට් විශේෂ ise තාවයකින් උපකාර කළ හැකිය.

ස්වාධීනව නිර්මාණය කරන ලද වෙළඳ නාම 160 ක් සමඟ ධාවනය කිරීමට අවශ්‍ය කේත මා සතුව ඇත. බොහෝ කේත ඇත්තේ හවුල් ලිපිගොනු වලය, නමුත් වෙළඳ නාම-විශේෂිත දේවල් වෙනම ගොනුවක ඇත, එක් එක් වෙළඳ නාම සඳහා එකක්.

සමහර වෙළඳ නාම සඳහා විශේෂිත කාර්යයන් අවශ්‍ය වන අතර සමහර ඒවා අවශ්‍ය නොවේ. සමහර විට මට නව වෙළඳ නාම විශේෂිත දේවල් කිරීමට නව කාර්යයන් එක් කිරීමට සිදුවේ. හවුල් කේතනය වෙනස් කිරීම ගැන මම සතුටු වෙමි, නමුත් වෙළඳ නාම ගොනු 160 ක්ම වෙනස් කිරීමට මට අවශ්‍ය නැත.

විචල්ය සින්ටැක්ස් භාවිතා කිරීමෙන්, මට හවුල් කේතය තුළ විචල්යය (ක්රියාකාරී දර්ශකයක් අවශ්ය ලෙස) ප්රකාශ කළ හැකි අතර සුළු සුළු මුරණ්ඩු කාර්යයක් පැවරිය හැකිය, නැතහොත් ශුන්ය ලෙස සකසා ඇත.

ශ්‍රිතය නිශ්චිත ලෙස ක්‍රියාත්මක කිරීම අවශ්‍ය වන වෙළඳ නාම එකක් හෝ දෙකක් පසුව ඒවායේ ශ්‍රිතයේ අනුවාදය නිර්වචනය කර ඔවුන්ට අවශ්‍ය නම් විචල්‍යයට මෙය පැවරිය හැකි අතර අනෙක් ඒවා කිසිවක් නොකරයි. හවුල් කේතයෙන් එය ක්‍රියාත්මක කිරීමට පෙර මට ශුන්‍ය ශ්‍රිතයක් පරීක්ෂා කළ හැකිය.

ඉහත පුද්ගලයින්ගේ අදහස් වලින්, ස්ථිතික ශ්‍රිතයක් ද නැවත අර්ථ දැක්විය හැකි යැයි මම සිතමි, නමුත් විචල්‍ය විසඳුම හොඳ සහ පැහැදිලි ය.


25

ග්‍රෙග්ගේ පිළිතුර ප්‍රමාණවත්ය, නමුත් මම තවමත් ඩග්ලස් ක්‍රොක්ෆර්ඩ්ගේ වීඩියෝ නැරඹීමෙන් ඉගෙන ගත් යමක් එයට එකතු කිරීමට කැමැත්තෙමි .

ක්‍රියාකාරී ප්‍රකාශනය:

var foo = function foo() {};

ක්‍රියාකාරී ප්‍රකාශය:

function foo() {};

ශ්‍රිත ප්‍රකාශය යනු අගය varසහිත ප්‍රකාශයක් සඳහා වූ කෙටි යෙදුමකි function.

ඒ නිසා

function foo() {};

දක්වා පුළුල් වේ

var foo = function foo() {};

එය තවදුරටත් පුළුල් වන්නේ:

var foo = undefined;
foo = function foo() {};

තවද ඔවුන් දෙදෙනාම කේතයේ ඉහළට ඔසවා ඇත.

වීඩියෝවෙන් තිර රුව


7
කණගාටුයි නමුත් මෙය වැරදියි - ක්‍රොක්ෆර්ඩ් එම විනිවිදකයේ කීමට උත්සාහ කරන්නේ කුමක්දැයි මම නොදනිමි. ක්‍රියාකාරීත්වය සහ විචල්‍ය ප්‍රකාශ දෙකම සෑම විටම ඒවායේ විෂය පථයට ඉහළින් ඔසවනු ලැබේ. වෙනස වන්නේ විචල්‍ය පැවරුම් (ඔබ එය නූලක්, බූලියන් හෝ ශ්‍රිතයක් සමඟ පවරන්නේද යන්න) ඉහළට ඔසවා නොමැති අතර ශ්‍රිත සිරුරු (ශ්‍රිත ප්‍රකාශය භාවිතා කරමින්) ය.
තෝමස් හේමන්

මෙම කේත උදාහරණ දෙස බලන්න: gist.github.com/cyberthom/36603fbc20de8e04fd09
තෝමස් හේමන්

24

පහත ලැයිස්තුගත කර ඇති පරිදි විවිධ ශ්‍රිත ප්‍රකාශ දෙක අතර සැසඳීම් හතරක් ඇත.

  1. ශ්‍රිතයේ ඇති හැකියාව (විෂය පථය)

function add()ළඟම ඇති කොටස වෙත පරික්ෂා කර ඇති නිසා පහත සඳහන් ක්‍රියා කරයි :

try {
  console.log("Success: ", add(1, 1));
} catch(e) {
  console.log("ERROR: " + e);
}

function add(a, b){
  return a + b;
}

පහත දැක්වෙන්නේ ක්‍රියා නොකරයි, මන්ද විචල්‍යයට ශ්‍රිත අගයක් පැවරීමට පෙර විචල්‍යය හැඳින්වේ add.

try {
  console.log("Success: ", add(1, 1));
} catch(e) {
  console.log("ERROR: " + e);
}

var add=function(a, b){
  return a + b;
}

ඉහත කේතය පහත කේතයට ක්‍රියාකාරීත්වයට සමාන වේ. පැහැදිලි ලෙසම පැවරීම බව සටහන add = undefinedලකුණය නිසා අනවශ්ය වේ var add;හරියටම සමාන වන්නේ var add=undefined.

var add = undefined;

try {
  console.log("Success: ", add(1, 1));
} catch(e) {
  console.log("ERROR: " + e);
}

add = function(a, b){
  return a + b;
}

var add=සුපිරි සීඩ්ස් නිසා පහත සඳහන් දෑ ක්‍රියා නොකරයි function add().

try {
  console.log("Success: ", add(1, 1));
} catch(e) {
  console.log("ERROR: " + e);
}

var add=function add(a, b){
  return a + b;
}

  1. (ශ්‍රිතය). නම

උත්සවයකට නම function thefuncname(){}වේ thefuncname එය මේ ආකාරයෙන් ප්රකාශ වන විට පමණි.

function foobar(a, b){}

console.log(foobar.name);

var a = function foobar(){};

console.log(a.name);

එසේ නොමැති නම්, ශ්රිතයක් ලෙස ප්රකාශයට පත් කරන්නේ function(){}ද, උත්සවය .name ශ්රිතය ගබඩා කිරීම සඳහා භාවිතා වූ පළමු විචල්ය වේ.

var a = function(){};
var b = (function(){ return function(){} });

console.log(a.name);
console.log(b.name);

ශ්‍රිතයට විචල්‍යයන් කිසිවක් සකසා නොමැති නම්, ශ්‍රිතයේ නම හිස් නූලයි ( "").

console.log((function(){}).name === "");

අවසාන වශයෙන්, ශ්‍රිතය මුලින් නම සැකසීමට පවරා ඇති අතර, ශ්‍රිතයට අනුප්‍රාප්තික විචල්‍යයන් නම වෙනස් නොකරයි.

var a = function(){};
var b = a;
var c = b;

console.log(a.name);
console.log(b.name);
console.log(c.name);

  1. කාර්ය සාධනය

ගූගල් හි V8 සහ ෆයර්ෆොක්ස් හි ස්පයිඩර්මන්කි වල මයික්‍රෝ තත්පර JIST සම්පාදන වෙනසක් තිබිය හැකි නමුත් අවසානයේ ප්‍රති result ලය හරියටම සමාන වේ. මෙය සනාථ කිරීම සඳහා, හිස් කේත ස්නිපෙට් දෙකක වේගය සංසන්දනය කිරීමෙන් මයික්‍රොබෙන්මාර්ක් වල ජේඑස්පර්ෆ්හි කාර්යක්ෂමතාව විමසා බලමු. මෙම JSPerf පරීක්ෂණ මෙහි දක්නට ඇති . තවද, මෙහි ඇති jsben.ch testare . ඔබට පෙනෙන පරිදි, කිසිවක් නොමැති විට සැලකිය යුතු වෙනසක් ඇත. ඔබ සැබවින්ම මා වැනි කාර්ය සාධන විහිළුවක් නම්, විෂය පථයේ විචල්‍යයන් සහ ක්‍රියාකාරකම් ගණන අඩු කිරීමට උත්සාහ කරන අතරම විශේෂයෙන් බහුමාපකය ඉවත් කිරීම (විවිධ වර්ග දෙකක් ගබඩා කිරීම සඳහා එකම විචල්‍යය භාවිතා කිරීම වැනි) ඔබේ වටිනාකම වඩා වටී.

  1. විචල්ය විකෘතිතාව

varවිචල්‍යයක් ප්‍රකාශ කිරීම සඳහා ඔබ යතුරු පදය භාවිතා කරන විට , ඔබට විචල්‍යයට වෙනස් අගයක් නැවත ලබා දිය හැකිය.

(function(){
    "use strict";
    var foobar = function(){}; // initial value
    try {
        foobar = "Hello World!"; // new value
        console.log("[no error]");
    } catch(error) {
        console.log("ERROR: " + error.message);
    }
    console.log(foobar, window.foobar);
})();

කෙසේ වෙතත්, අපි const-statement භාවිතා කරන විට, විචල්ය යොමුව වෙනස් කළ නොහැක. මෙයින් අදහස් කරන්නේ අපට විචල්‍යයට නව අගයක් පැවරිය නොහැකි බවයි. කෙසේ වෙතත්, මෙය විචල්‍යයේ අන්තර්ගතය වෙනස් කළ නොහැකි බව කරුණාවෙන් සලකන්න: ඔබ එසේ කරන්නේ නම් const arr = [], ඔබට තවමත් කළ හැකිය arr[10] = "example". පහත දැක්වෙන පරිදි දෝෂයක් වැනි දෙයක් කිරීම arr = "new value"හෝ කිරීම පමණි arr = [].

(function(){
    "use strict";
    const foobar = function(){}; // initial value
    try {
        foobar = "Hello World!"; // new value
        console.log("[no error]");
    } catch(error) {
        console.log("ERROR: " + error.message);
    }
    console.log(foobar, window.foobar);
})();

සිත්ගන්නා කරුණ නම්, අපි විචල්‍යය ලෙස ප්‍රකාශ කරන්නේ නම්, විචල්‍යයේ වෙනස් function funcName(){}කළ නොහැකි බව එය ප්‍රකාශ කිරීමට සමාන වේ var.

(function(){
    "use strict";
    function foobar(){}; // initial value
    try {
        foobar = "Hello World!"; // new value
        console.log("[no error]");
    } catch(error) {
        console.log("ERROR: " + error.message);
    }
    console.log(foobar, window.foobar);
})();

"ආසන්නතම කොටස" යනු කුමක්ද?

"ළඟම ඇති කොටස" යනු ආසන්නතම "ශ්‍රිතය" (අසමමුහුර්ත ශ්‍රිත, උත්පාදක ශ්‍රිත සහ අසමමුහුර්ත උත්පාදක ශ්‍රිත ඇතුළුව). කෙසේ වෙතත්, සිත්ගන්නා function functionName() {}කරුණ නම්, var functionName = function() {}පිටත අයිතමයන් වසා නොදැමීමකදී වසා දැමීමක් යැයි කියනු ලැබේ. නිරීක්ෂණය කරන්න.

  • සාමාන්‍යයි var add=function(){}

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}');
  }
} catch(e) {
  console.log("Is a block");
}
var add=function(a, b){return a + b}

  • සාමාන්‍යයි function add(){}

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
function add(a, b){
  return a + b;
}

  • ක්රියාකාරිත්වය

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
(function () {
    function add(a, b){
      return a + b;
    }
})();

  • ප්රකාශනය (වැනි if, else, for, while, try/ catch/ finally, switch, do/ while, with)

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
{
    function add(a, b){
      return a + b;
    }
}

  • සමඟ ඊතල ක්‍රියාකාරිත්වය var add=function()

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
(() => {
    var add=function(a, b){
      return a + b;
    }
})();

  • ඊතල ක්‍රියාකාරිත්වය සමඟ function add()

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
(() => {
    function add(a, b){
      return a + b;
    }
})();


මෙය පිළිගත් හා වඩාත්ම උත්තරීතර පිළිතුර විය යුතුය
ආරොන් ජෝන් සාබු

ඔව්, ඔබ මුලින් සඳහන් කළ දෙයට නමක් තිබේ. එය "එසවීම" ලෙස හැඳින්වේ.
Sapphire_Brick

18

Ug ඉයුජින්ලාසුට්කින් තමාට අභ්‍යන්තර යොමු කිරීමක් ලෙස භාවිතා කළ හැකි පරිදි පවරා ඇති ශ්‍රිතයක් නම්shortcut() කරන උදාහරණයක් සපයයි . ජෝන් රෙසිග් තවත් උදාහරණයක් සපයයි - ඔහුගේ ඉගෙනුම් උසස් ජාවාස්ක්‍රිප්ට් නිබන්ධනයේ වෙනත් වස්තුවකට පවරා ඇති පුනරාවර්තන ශ්‍රිතයක් පිටපත් කිරීම . ගුණාංග සඳහා කාර්යයන් පැවරීම මෙහි දී ප්‍රශ්නයක් නොවන අතර, නිබන්ධනය ක්‍රියාකාරීව අත්හදා බැලීමට මම නිර්දේශ කරමි - ඉහළ දකුණු කෙළවරේ ඇති බොත්තම ක්ලික් කිරීමෙන් කේතය ධාවනය කරන්න, ඔබේ කැමැත්ත පරිදි සංස්කරණය කිරීමට කේතය දෙවරක් ක්ලික් කරන්න.

නිබන්ධනයෙන් උදාහරණ: පුනරාවර්තන ඇමතුම් yell():

මුල් නින්ජා වස්තුව ඉවත් කළ විට පරීක්ෂණ අසාර්ථක වේ. (13 වන පිටුව)

var ninja = { 
  yell: function(n){ 
    return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; 
  } 
}; 
assert( ninja.yell(4) == "hiyaaaa", "A single object isn't too bad, either." ); 

var samurai = { yell: ninja.yell }; 
var ninja = null; 

try { 
  samurai.yell(4); 
} catch(e){ 
  assert( false, "Uh, this isn't good! Where'd ninja.yell go?" ); 
}

පුනරාවර්තන ලෙස හැඳින්වෙන ශ්‍රිතය ඔබ නම් කළහොත්, පරීක්ෂණ සමත් වනු ඇත. (14 වන පිටුව)

var ninja = { 
  yell: function yell(n){ 
    return n > 0 ? yell(n-1) + "a" : "hiy"; 
  } 
}; 
assert( ninja.yell(4) == "hiyaaaa", "Works as we would expect it to!" ); 

var samurai = { yell: ninja.yell }; 
var ninja = {}; 
assert( samurai.yell(4) == "hiyaaaa", "The method correctly calls itself." );

17

අනෙක් පිළිතුරු වල සඳහන් නොවන තවත් වෙනසක් නම් ඔබ නිර්නාමික ශ්‍රිතය භාවිතා කරන්නේ නම්

var functionOne = function() {
    // Some code
};

එය ඉදිකිරීම්කරුවෙකු ලෙස භාවිතා කරන්න

var one = new functionOne();

එවිට one.constructor.nameනිර්වචනය නොකෙරේ. Function.nameසම්මත නොවන නමුත් ෆයර්ෆොක්ස්, ක්‍රෝම්, වෙනත් වෙබ්කිට්-ව්‍යුත්පන්න බ්‍රව්සර් සහ අයිඊ 9+ සහාය දක්වයි.

සමඟ

function functionTwo() {
    // Some code
}
two = new functionTwo();

සමඟ නූලක් ලෙස ඉදිකිරීම්කරුගේ නම ලබා ගත හැකිය two.constructor.name.


පළමු අවස්ථාවෙහි නම නිර්වචනය නොකරන්නේ එහි නිර්නාමික ශ්‍රිතය විචල්‍යයකට පවරා ඇති බැවිනි. මම හිතන්නේ නිර්නාමික යන වචනය නිර්මාණය කර ඇත්තේ ඔවුන්ගේ නම නිර්වචනය කර නැති දේවල් සඳහා :)
ඕම් ශංකර්

මෙම උදාහරණයේ දී දෙක = නව ගෝලීය ශ්‍රිතයක් බවට පත්වන්නේ var
වකාස් තාහීර්

16

පළමු එක (ශ්‍රිතය doSomething (x)) වස්තු අංකනයක කොටසක් විය යුතුය.

දෙවැන්න ( var doSomething = function(x){ alert(x);}) හුදෙක් නිර්නාමික ශ්‍රිතයක් නිර්මාණය කර විචල්‍යයකට පැවරීමයි doSomething. එබැවින් doSomething () ශ්‍රිතය අමතනු ඇත.

ශ්‍රිත ප්‍රකාශයක් සහ ක්‍රියාකාරී ප්‍රකාශනයක් යනු කුමක්දැයි ඔබට දැන ගැනීමට අවශ්‍ය විය හැකිය .

ශ්‍රිත ප්‍රකාශනය මඟින් විචල්‍ය පැවරුම් අවශ්‍ය නොවී නම් කරන ලද ශ්‍රිත විචල්‍යයක් අර්ථ දක්වයි. ක්‍රියාකාරී ප්‍රකාශයන් සිදුවන්නේ ස්වාධීන ඉදිකිරීම් ලෙස වන අතර ඒවා ක්‍රියාකාරී නොවන කොටස් තුළ කූඩු කළ නොහැක.

function foo() {
    return 3;
}

ECMA 5 (13.0) සින්ටැක්ස්
ශ්‍රිතය හැඳුනුම්පත ලෙස අර්ථ දක්වයි (FormalParameterList opt ) {FunctionBody}

ඉහත තත්වය තුළ ශ්‍රිතයේ නම එහි විෂය පථය තුළ සහ මවුපියන්ගේ විෂය පථය තුළ දැකිය හැකිය (එසේ නොමැති නම් එය ළඟා විය නොහැක).

සහ ශ්‍රිත ප්‍රකාශනයක

ශ්‍රිත ප්‍රකාශනයක් මඟින් ශ්‍රිතයක් විශාල ප්‍රකාශන වාක්‍ය ඛණ්ඩයක කොටසක් ලෙස අර්ථ දක්වයි (සාමාන්‍යයෙන් විචල්‍ය පැවරුමක්). ශ්‍රිත ප්‍රකාශන හරහා අර්ථ දක්වා ඇති කාර්යයන් නම් කිරීම හෝ නිර්නාමික කිරීම කළ හැකිය. ක්‍රියාකාරී ප්‍රකාශන “ශ්‍රිතය” සමඟ ආරම්භ නොවිය යුතුය.

// Anonymous function expression
var a = function() {
    return 3;
}

// Named function expression
var a = function foo() {
    return 3;
}

// Self-invoking function expression
(function foo() {
    alert("hello!");
})();

ECMA 5 (13.0) ලෙස කාරක රීති නිර්වචනය
කාර්යය හඳුන්වනය ඉවත් (FormalParameterList ඉවත් ) {FunctionBody}


16

මම පහත වෙනස්කම් ලැයිස්තුගත කරමි:

  1. කේතයේ ඕනෑම තැනක ශ්‍රිත ප්‍රකාශයක් තැබිය හැකිය. කේතයේ අර්ථ දැක්වීම දිස්වීමට පෙර එය ආයාචනා කළද, එය ක්‍රියාත්මක වන්නේ පිටුවේ වෙනත් කේතයක් ක්‍රියාත්මක වීමට පෙර ක්‍රියාකාරී ප්‍රකාශනය මතකයට බැඳී ඇති නිසා හෝ එය ඔසවා ඇති ආකාරයට ය.

    පහත ශ්‍රිතය දෙස බලන්න:

    function outerFunction() {
        function foo() {
           return 1;
        }
        return foo();
        function foo() {
           return 2;
        }
    }
    alert(outerFunction()); // Displays 2

    මෙයට හේතුව, ක්‍රියාත්මක කිරීමේදී එය පෙනෙන්නේ: -

    function foo() {  // The first function declaration is moved to top
        return 1;
    }
    function foo() {  // The second function declaration is moved to top
        return 2;
    }
    function outerFunction() {
        return foo();
    }
    alert(outerFunction()); //So executing from top to bottom,
                            //the last foo() returns 2 which gets displayed

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

    ශ්‍රිත ප්‍රකාශන භාවිතා කරමින් එකම ශ්‍රිතය:

    function outerFunction() {
        var foo = function() {
           return 1;
        }
        return foo();
        var foo = function() {
           return 2;
        }
    }
    alert(outerFunction()); // Displays 1

    මෙයට හේතුව ක්‍රියාත්මක කිරීමේදී එය පෙනෙන්නේ:

    function outerFunction() {
       var foo = undefined;
       var foo = undefined;
    
       foo = function() {
          return 1;
       };
       return foo ();
       foo = function() {   // This function expression is not reachable
          return 2;
       };
    }
    alert(outerFunction()); // Displays 1
  2. ඒ වගේ-කාර්යය නොවන කොටස් තුළ කටයුතු ප්රකාශ ලිවීමට ආරක්ෂිත නෑ නම් ඔවුන් ප්රවේශ වනු ඇත නිසා.

    if (test) {
        function x() { doSomething(); }
    }
  3. 9 වැනි අනුවාදයට පෙර ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් බ්‍රව්සර් තුළ ක්‍රියා නොකරනු ඇත.

    var today = function today() {return new Date()}

1
Ar අර්ජුන් මීට වසර ගණනාවකට පෙර ප්‍රශ්නයක් ඇසුවොත් ගැටලුව කුමක්ද? පිළිතුරක් OP ට පමණක් නොව සියලුම SO භාවිතා කරන්නන්ටද ප්‍රයෝජනවත් නොවේ. දැනටමත් පිළිගත් පිළිතුරක් ඇති ප්‍රශ්නවලට පිළිතුරු සැපයීමේ වරද කුමක්ද?
සැන්ටිබයිලර්ස්

1
අර්ජුන් පරණ ප්‍රශ්නවලට පිළිතුරු දීම නරක නැතැයි ඔබ තේරුම් ගත යුතුය. එය එසේ වූයේ නම්, SO ට එවැනි බාධකයක් තිබෙන්නට ඇත. ඒපීඅයි හි වෙනසක් ඇතැයි සිතන්න (මෙම ප්‍රශ්නයේ සන්දර්භය තුළ නොවුනත්) යමෙකු එය හඳුනාගෙන නව ඒපීඅයි සමඟ පිළිතුරක් සපයයි, එයට ඉඩ දිය යුතු නොවේද ?? පිළිතුර තේරුමක් නැති අතර මෙහි අයිති නැතිනම්, එය පහත් කොට ස්වයංක්‍රීයව ඉවත් කරනු ලැබේ. ඔබට ඒ ගැන කරදර වීමට අවශ්‍ය නැත !!!!
සුදාන්සු චෞද්රි

15

වස්තු නිර්මාණය කිරීම සඳහා ඔබ එම කාර්යයන් භාවිතා කරන්නේ නම්, ඔබට ලැබෙනුයේ:

var objectOne = new functionOne();
console.log(objectOne.__proto__); // prints "Object {}" because constructor is an anonymous function

var objectTwo = new functionTwo();
console.log(objectTwo.__proto__); // prints "functionTwo {}" because constructor is a named function

මට මෙය ප්‍රතිනිෂ්පාදනය කරන බවක් නොපෙනේ. console.log(objectOne.__proto__);මගේ කොන්සෝලය තුළ "functionOne {}" මුද්‍රණය කරයි. මෙය එසේ විය හැක්කේ මන්ද යන්න පිළිබඳ කිසියම් අදහසක් තිබේද?
මයික්

මට එය ප්‍රතිනිෂ්පාදනය කරන බවක් නොපෙනේ.
daremkd

1
මෙය ඔබගේ නිදොස්කරණය කරන්නාගේ හැකියාවකි (ලොග් වූ වස්තුවෙහි "පන්තිය" පෙන්වීමට), බොහෝ අයට මේ දිනවල නිර්නාමික ශ්‍රිත ප්‍රකාශන සඳහා පවා නමක් ලබා ගත හැකිය. Btw, අවස්ථා දෙක අතර ක්‍රියාකාරී වෙනසක් නොමැති බව ඔබ පැහැදිලි කළ යුතුය.
බර්ගි

12

“නම් කරන ලද ශ්‍රිතයන් තොග හෝඩුවාවන්හි පෙන්වයි” යන තර්කය අනුව, නූතන ජාවාස්ක්‍රිප්ට් එන්ජින් ඇත්ත වශයෙන්ම නිර්නාමික ශ්‍රිත නිරූපණය කිරීමට බෙහෙවින් සමත් ය.

මෙම ලිවීමට අනුව, V8, SpiderMonkey, Chakra සහ Nitro සෑම විටම නම් කරන ලද කාර්යයන් ඔවුන්ගේ නම් වලින් සඳහන් කරයි. ඔවුන් සෑම විටම පාහේ නිර්නාමික ශ්‍රිතයක් එහි අනන්‍යතාවය ඇත්නම් එය හඳුන්වයි.

SpiderMonkey හට වෙනත් ශ්‍රිතයකින් ආපසු එන නිර්නාමික ශ්‍රිතයක නම හඳුනාගත හැකිය. අනිත් අයට බැහැ.

ඔබට ඇත්ත වශයෙන්ම අවශ්‍ය නම්, ඔබේ අනුකාරකය සහ සාර්ථක ඇමතුම් ලබා ගැනීම හෝඩුවාවෙහි පෙන්වීමට නම්, ඔබට ඒවා නම් කළ හැකිය ...

[].forEach(function iterator() {});

නමුත් බොහෝ දුරට එය අවධාරණය කිරීම වටී නැත.

පටි ( ෆිදෙල් )

'use strict';

var a = function () {
    throw new Error();
},
    b = function b() {
        throw new Error();
    },
    c = function d() {
        throw new Error();
    },
    e = {
        f: a,
        g: b,
        h: c,
        i: function () {
            throw new Error();
        },
        j: function j() {
            throw new Error();
        },
        k: function l() {
            throw new Error();
        }
    },
    m = (function () {
        return function () {
            throw new Error();
        };
    }()),
    n = (function () {
        return function n() {
            throw new Error();
        };
    }()),
    o = (function () {
        return function p() {
            throw new Error();
        };
    }());

console.log([a, b, c].concat(Object.keys(e).reduce(function (values, key) {
    return values.concat(e[key]);
}, [])).concat([m, n, o]).reduce(function (logs, func) {

    try {
        func();
    } catch (error) {
        return logs.concat('func.name: ' + func.name + '\n' +
                           'Trace:\n' +
                           error.stack);
        // Need to manually log the error object in Nitro.
    }

}, []).join('\n\n'));

වී 8

func.name: 
Trace:
Error
    at a (http://localhost:8000/test.js:4:11)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: b
Trace:
Error
    at b (http://localhost:8000/test.js:7:15)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: d
Trace:
Error
    at d (http://localhost:8000/test.js:10:15)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: 
Trace:
Error
    at a (http://localhost:8000/test.js:4:11)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: b
Trace:
Error
    at b (http://localhost:8000/test.js:7:15)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: d
Trace:
Error
    at d (http://localhost:8000/test.js:10:15)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: 
Trace:
Error
    at e.i (http://localhost:8000/test.js:17:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: j
Trace:
Error
    at j (http://localhost:8000/test.js:20:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: l
Trace:
Error
    at l (http://localhost:8000/test.js:23:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: 
Trace:
Error
    at http://localhost:8000/test.js:28:19
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: n
Trace:
Error
    at n (http://localhost:8000/test.js:33:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: p
Trace:
Error
    at p (http://localhost:8000/test.js:38:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27 test.js:42

ස්පයිඩර්මන්කි

func.name: 
Trace:
a@http://localhost:8000/test.js:4:5
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: b
Trace:
b@http://localhost:8000/test.js:7:9
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: d
Trace:
d@http://localhost:8000/test.js:10:9
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: 
Trace:
a@http://localhost:8000/test.js:4:5
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: b
Trace:
b@http://localhost:8000/test.js:7:9
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: d
Trace:
d@http://localhost:8000/test.js:10:9
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: 
Trace:
e.i@http://localhost:8000/test.js:17:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: j
Trace:
j@http://localhost:8000/test.js:20:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: l
Trace:
l@http://localhost:8000/test.js:23:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: 
Trace:
m</<@http://localhost:8000/test.js:28:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: n
Trace:
n@http://localhost:8000/test.js:33:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: p
Trace:
p@http://localhost:8000/test.js:38:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1

චක්‍ර

func.name: undefined
Trace:
Error
   at a (http://localhost:8000/test.js:4:5)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at b (http://localhost:8000/test.js:7:9)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at d (http://localhost:8000/test.js:10:9)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at a (http://localhost:8000/test.js:4:5)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at b (http://localhost:8000/test.js:7:9)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at d (http://localhost:8000/test.js:10:9)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at e.i (http://localhost:8000/test.js:17:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at j (http://localhost:8000/test.js:20:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at l (http://localhost:8000/test.js:23:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at Anonymous function (http://localhost:8000/test.js:28:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at n (http://localhost:8000/test.js:33:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at p (http://localhost:8000/test.js:38:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)

නයිට්‍රෝ

func.name: 
Trace:
a@http://localhost:8000/test.js:4:22
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: b
Trace:
b@http://localhost:8000/test.js:7:26
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: d
Trace:
d@http://localhost:8000/test.js:10:26
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: 
Trace:
a@http://localhost:8000/test.js:4:22
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: b
Trace:
b@http://localhost:8000/test.js:7:26
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: d
Trace:
d@http://localhost:8000/test.js:10:26
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: 
Trace:
i@http://localhost:8000/test.js:17:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: j
Trace:
j@http://localhost:8000/test.js:20:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: l
Trace:
l@http://localhost:8000/test.js:23:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: 
Trace:
http://localhost:8000/test.js:28:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: n
Trace:
n@http://localhost:8000/test.js:33:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: p
Trace:
p@http://localhost:8000/test.js:38:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

12

ජාවාස්ක්‍රිප්ට් හි කාර්යයන් නිර්මාණය කිරීමට ක්‍රම දෙකක් තිබේ:

  1. කාර්ය ප්‍රකාශනය:

    function fn(){
      console.log("Hello");
    }
    fn();

    මෙය ඉතා මූලික, ස්වයං පැහැදිලි කිරීමකි, බොහෝ භාෂාවල භාවිතා වන අතර C පවුලේ භාෂාවන් අතර ප්‍රමිතියකි. ශ්‍රිතයක් එය අර්ථ දක්වා ඇති අතර එය ඇමතීමෙන් එය ක්‍රියාත්මක කළෙමු.

    ඔබ දැනගත යුතු දෙය නම් කාර්යයන් සැබවින්ම ජාවාස්ක්‍රිප්ට් හි වස්තු බව; අභ්‍යන්තරව අප ඉහත ශ්‍රිතය සඳහා වස්තුවක් නිර්මාණය කර එයට fn නමින් නමක් ලබා දී ඇත. කාර්යයන් යනු ජාවාස්ක්‍රිප්ට් හි වස්තු ය; ශ්‍රිතයේ උදාහරණයක් ඇත්ත වශයෙන්ම වස්තු නිදසුනකි.

  2. ක්‍රියාකාරී ප්‍රකාශනය:

    var fn=function(){
      console.log("Hello");
    }
    fn();

    ජාවාස්ක්‍රිප්ට් හි පළමු පන්තියේ කාර්යයන් ඇත, එනම්, ශ්‍රිතයක් නිර්මාණය කර එය විචල්‍යයකට අනුයුක්ත කරන්න. මෙන්න, fn විචල්‍යය ශ්‍රිතයකට පවරා ඇත. මෙම සංකල්පයට හේතුව කාර්යයන් වන්නේ ජාවාස්ක්‍රිප්ට් හි ඇති වස්තු ය; fn පෙන්වා දෙන්නේ ඉහත ශ්‍රිතයේ වස්තු උදාහරණයට ය. අපි ශ්‍රිතයක් ආරම්භ කර එය විචල්‍යයකට පවරා ඇත්තෙමු. එය ශ්‍රිතය ක්‍රියාත්මක කිරීම සහ ප්‍රති .ලය පැවරීම නොවේ.

යොමුව: ජාවාස්ක්‍රිප්ට් ශ්‍රිත ප්‍රකාශන වාක්‍ය ඛණ්ඩය: var fn = ශ්‍රිතය () function} එදිරිව ශ්‍රිතය fn () {}


1
තෙවන විකල්පය ගැන කුමක් කිව var fn = function fn() {...}හැකිද?
චාර්වි

හායි චාර්වි, ඔබේ ප්‍රශ්නය ගැන විශ්වාස නැත, මම දැනටමත් සඳහන් කර ඇති ක්‍රියාකාරී ප්‍රකාශනය ගැන කතා කරමි. කෙසේ වෙතත්, තවමත් යම් ව්‍යාකූලතාවයක් ඇත්නම් වඩාත් සවිස්තරාත්මක වන්න.
අනූප් රායි

ඔව්, මම ඇසුවේ නම් කරන ලද ශ්‍රිත ප්‍රකාශනයක් ගැන ය. ශ්‍රිතයට අනන්‍යතාවයක් ඇති බව හැර එය ඔබගේ විකල්ප අංක 2 ට සමාන වේ. සාමාන්‍යයෙන් මෙම හඳුනාගැනුම එය පවරා ඇති විචල්‍යයට සමාන වේ, නමුත් එය සැමවිටම එසේ නොවේ.
චාර්වි

1
ඔව් නම් කරන ලද ශ්‍රිත ප්‍රකාශනය මගේ විකල්පය # 2 ට සමාන වේ. හොඳින් හඳුනාගැනීමක් තිබීම අනිවාර්ය නොවේ. ඔබ ශ්‍රිත ප්‍රකාශනය ක්‍රියාත්මක කරන සෑම අවස්ථාවකම ඔබ ක්‍රියාකාරී වස්තුව රඳවාගෙන ඇති විචල්‍යය භාවිතා කරනු ඇත. හැඳුනුම්පත කිසිදු අරමුණක් ඉටු නොකරයි.
අනූප් රායි

11

දෙකම ශ්‍රිතයක් අර්ථ දැක්වීමේ විවිධ ක්‍රම වේ. වෙනස වන්නේ බ්‍රව්සරය අර්ථ නිරූපණය කර ඒවා ක්‍රියාත්මක කිරීමේ සන්දර්භයකට පටවන ආකාරයයි.

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

functionOne();
var functionOne = function() {
    // Some code
};

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

දෙවන පේළියේ අපි නිර්නාමික ශ්‍රිතයක් යොමු කිරීම functionOne වෙත පවරමු.

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

functionOne();
function functionOne() {
   // Some code
}

11

කාර්ය සාධනය ගැන:

නව අනුවාදයන් V8හූඩ් යටින් ඇති ප්‍රශස්තිකරණ කිහිපයක් හඳුන්වා දුන් අතර එසේ විය SpiderMonkey.

ප්‍රකාශනය සහ ප්‍රකාශය අතර දැන් කිසිදු වෙනසක් නැත.
ක්‍රියාකාරී ප්‍රකාශනය දැන් වේගවත් බව පෙනේ .

Chrome 62.0.3202 Chrome පරීක්ෂණය

ෆයර්ෆොක්ස් 55 ෆයර්ෆොක්ස් පරීක්ෂණය

ක්‍රෝම් කැනරි 63.0.3225 Chrome Canary පරීක්ෂණය


Anonymousකාර්යය ප්රකාශන කාර්යසාධන ඇති බවක් පෙනී යයි එරෙහිව Namedකාර්යය ප්රකාශනය.


ෆයර්ෆොක්ස් ක්‍රෝම් කැනරි ක්‍රෝම්ෆයර්ෆොක්ස් නම් කර ඇත ක්‍රෝම් කැනරි නම් කර ඇත ක්‍රෝම් නම්_අනොනිමස්


1
ඔව්, මෙම වෙනස කෙතරම් වැදගත්ද යත්, වේගවත් විය හැකි දේට වඩා ඔවුන්ගේ විශේෂිත අවශ්‍යතා සඳහා වඩා හොඳ නඩත්තු කළ හැකි ප්‍රවේශය පිළිබඳව ඩෙවෙස් තමන් ගැනම සැලකිලිමත් වනු ඇත (බ්‍රව්සරය කරන්නේ කුමක්ද යන්න මත පදනම්ව සෑම උත්සාහයකදීම ඔබට විවිධ jsperf ප්‍රති results ල ලැබෙනු ඇත - ජාවාස්ක්‍රිප්ට් කාර්යයන් බහුතරයක් මෙම මට්ටමට ක්ෂුද්‍ර ප්‍රශස්තිකරණයන් ගැන සැලකිලිමත් විය යුතු නැත).
squidbe

qusquidbe වෙනසක් නැහැ. මෙහි බලන්න: jsperf.com/empty-tests-performance
ජැක් ගිෆින්

10

ඒවා කුඩා වෙනස්කම් සමඟ බෙහෙවින් සමාන ය, පළමුවැන්න නිර්නාමික ශ්‍රිතයකට (ශ්‍රිත ප්‍රකාශනය) පවරා ඇති විචල්‍යයක් වන අතර දෙවැන්න ජාවාස්ක්‍රිප්ට් (නිර්නාමික ශ්‍රිත ප්‍රකාශනය) හි ශ්‍රිතයක් නිර්මාණය කිරීමේ සාමාන්‍ය ක්‍රමය වන අතර, දෙකම භාවිතය, අවාසි සහ වාසි ඇත :

1. ක්‍රියාකාරී ප්‍රකාශනය

var functionOne = function() {
    // Some code
};

ශ්‍රිත ප්‍රකාශනය මඟින් ශ්‍රිතයක් විශාල ප්‍රකාශන වාක්‍ය ඛණ්ඩයක කොටසක් ලෙස අර්ථ දක්වයි (සාමාන්‍යයෙන් විචල්‍ය පැවරුමකි). කාර්යයන් හරහා අර්ථ දක්වා ඇති කාර්යයන් ප්‍රකාශන හෝ නිර්නාමික විය හැකිය. ශ්‍රිත ප්‍රකාශන “ශ්‍රිතය” සමඟ ආරම්භ නොවිය යුතුය (එබැවින් පහත දැක්වෙන ස්වයං ආයාචනා උදාහරණය වටා ඇති වරහන්).

ශ්‍රිතයකට විචල්‍යයක් පැවරීම, ජාවාස්ක්‍රිප්ට් හි කාර්යයන් ඔසවා තැබිය හැකි බව අප දන්නා පරිදි, එසවීමක් නැත, එයින් අදහස් වන්නේ ඒවා ප්‍රකාශයට පත් කිරීමට පෙර ඒවා කැඳවිය හැකි අතර විචල්‍යයන් ඒවාට ප්‍රවේශ වීමට පෙර ප්‍රකාශ කළ යුතු බවයි, එබැවින් මේ අවස්ථාවේ දී අපට නොහැකි ය එය ප්‍රකාශයට පත් කිරීමට පෙර ශ්‍රිතයට ප්‍රවේශ වන්න, එය ඔබේ ශ්‍රිත ලිවීමේ ක්‍රමයක් විය හැකිය, වෙනත් ශ්‍රිතයක් ආපසු ලබා දෙන ශ්‍රිත සඳහා, මේ ආකාරයේ ප්‍රකාශයක් අර්ථවත් කළ හැකිය, ECMA6 සහ ඊට ඉහළින් ඔබට මෙය ඊතල ශ්‍රිතයකට පැවරිය හැකිය. නිර්නාමික ශ්‍රිත ඇමතීමට භාවිතා කළ හැකි අතර, ප්‍රකාශ කිරීමේ මෙම ක්‍රමය ජාවාස්ක්‍රිප්ට් හි ඉදිකිරීම්කරුවන්ගේ කාර්යයන් නිර්මාණය කිරීමට වඩා හොඳ ක්‍රමයකි.

2. කාර්ය ප්‍රකාශනය

function functionTwo() {
    // Some code
}

ශ්‍රිත ප්‍රකාශනය මඟින් විචල්‍ය පැවරුම් අවශ්‍ය නොවී නම් කරන ලද ශ්‍රිත විචල්‍යයක් අර්ථ දක්වයි. ක්‍රියාකාරී ප්‍රකාශයන් සිදුවන්නේ ස්වාධීන ඉදිකිරීම් ලෙස වන අතර ඒවා ක්‍රියාකාරී නොවන කොටස් තුළ කූඩු කළ නොහැක. ඔවුන් විචල්‍ය ප්‍රකාශයන්ගේ සහෝදර සහෝදරියන් ලෙස සිතීම ප්‍රයෝජනවත් වේ. විචල්‍ය ප්‍රකාශයන් “var” සමඟ ආරම්භ විය යුතු සේම, ශ්‍රිත ප්‍රකාශන “ශ්‍රිතය” සමඟ ආරම්භ විය යුතුය.

ජාවාස්ක්‍රිප්ට් හි ශ්‍රිතයක් ඇමතීමේ සාමාන්‍ය ක්‍රමය මෙයයි, ඔබ එය ජාවාස්ක්‍රිප්ට් හි මෙන් ප්‍රකාශයට පත් කිරීමට පෙර කැඳවිය හැක. රේඛාවල විශාල නොවන සහ ඉදිකිරීම් ශ්‍රිතයක් නොවන සියලුම සාමාන්‍ය ශ්‍රිතයන් ඇමතීමට.

එසේම, ජාවාස්ක්‍රිප්ට් හි එසවීම ක්‍රියා කරන ආකාරය පිළිබඳ වැඩි විස්තර අවශ්‍ය නම්, පහත සබැඳිය බලන්න:

https://developer.mozilla.org/en-US/docs/Glossary/Hoisting


1
...also this way of declaring is a better way to create Constructor functions in JavaScript, කරුණාකර විස්තාරනය කරන්න, මට කුතුහලයක්!
කාල් මොරිසන්

එක් හේතුවක් නම්, ජාවාස්ක්‍රිප්ට් හි ඇති සියලුම ඉදිකිරීම්කරුවන්ගේ කාර්යයන් මෙම ශ්‍රිත අංකය () {[ස්වදේශීය කේතය] like ලෙස නිර්මාණය කර ඇති අතර ඔබ ගොඩනංවන ලද ඒවා සමඟ පටලවා නොගත යුතු අතර, පසුව මෙම අවස්ථාවේදී යොමු කිරීම ආරක්ෂිත වන අතර ඔබ අවසන් වේ ඉහළට නීටර් කේතය නමුත් එසවීම භාවිතා නොකරයි ...
Alireza

8

මෙය ශ්‍රිත ප්‍රකාශ කළ හැකි ක්‍රම දෙකක් පමණක් වන අතර දෙවනුව ප්‍රකාශ කිරීමට පෙර ශ්‍රිතය භාවිතා කළ හැකිය.


7

new Function()ශ්‍රිතයේ සිරුර නූලකින් සම්මත කිරීමට භාවිතා කළ හැකිය. එබැවින් මෙය ගතික ශ්‍රිත නිර්මාණය කිරීමට යොදා ගත හැකිය. ස්ක්‍රිප්ට් එක ක්‍රියාත්මක නොකර ස්ක්‍රිප්ට් එක පසු කරන්න.

var func = new Function("x", "y", "return x*y;");
function secondFunction(){
   var result;
   result = func(10,20);
   console.log ( result );
}

secondFunction()

මෙය හොඳ සහ සත්‍ය වුවත්, අසන ලද quesiton සමඟ මෙය හරියටම සම්බන්ධ වන්නේ කෙසේද?
ජැක් ගිෆින්
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.