උද්දීපන සලකුණ ශ්‍රිතයට පෙර කරන්නේ කුමක්ද?


1257
!function () {}();

4
Ydykam එහි පිළිතුර මෙම පිළිතුරෙන් පැහැදිලි කර ඇත: stackoverflow.com/questions/5422585/…
hectorct


1
අපි එය
හඳුන්වන්නේ

8
articlebefzz මෙය ක්ෂණිකව ක්‍රියාත්මක වන ක්‍රියාකාරී ප්‍රකාශනයක් ලෙස හැඳින්වීමට වඩා හොඳය, එම ලිපිය පසුව පැහැදිලි කරන පරිදි (“ස්වයං ක්‍රියාත්මක කිරීම” යන්නෙන් පුනරාවර්තනය අදහස් වේ)
Zach Esposito

Answers:


2146

ජාවාස්ක්‍රිප්ට් සින්ටැක්ස් 101. මෙන්න ශ්‍රිත ප්‍රකාශයක් :

function foo() {}

අර්ධ සළකුණක් නොමැති බව සලකන්න: මෙය ශ්‍රිත ප්‍රකාශයක් පමණි . foo()ඇත්ත වශයෙන්ම ශ්‍රිතය ක්‍රියාත්මක කිරීම සඳහා ඔබට ආයාචනයක් අවශ්‍ය වේ.

දැන්, අප පෙනෙන පරිදි අහිංසක විශ්මය ජනක සලකුණක් එකතු කළ විට: !function foo() {}එය ප්‍රකාශනයක් බවට පත් කරයි . එය දැන් ක්‍රියාකාරී ප්‍රකාශනයකි .

මෙම !පමණක් ඇත්තෙන්ම, මෙම උත්සවය පහ වෙන්නේ නැහැ, නමුත් අපි දැන් කළ හැකි ()අවසන් වන විට: !function foo() {}()වඩා ඉහළ තැනක්ද ඇති !හා ක්ෂණිකව කාර්යයෙන් වේ.

එබැවින් කතුවරයා කරන්නේ ශ්‍රිත ප්‍රකාශනයකට බයිට් එකක් ඉතිරි කිරීමයි; වඩාත් කියවිය හැකි ලිවීමේ ක්‍රමයක් මෙය වනු ඇත:

(function(){})();

අවසාන වශයෙන්, !ප්‍රකාශනය නැවත සත්‍ය බවට පත් කරයි. මෙම නිසා පෙරනිමියෙන් සියලු IIFE ආපසු වේ undefinedඅප පිටත් වන, !undefinedවන true. විශේෂයෙන් ප්රයෝජනවත් නොවේ.


65
+1 ඔබට මෙය කිරීමට අවශ්‍ය ඇයිද යන්න සැබවින්ම ආමන්ත්‍රණය කරන එකම පිළිතුර මෙය වන අතර, ප්‍රතිලාභ ප්‍රති result ලය ප්‍රතික්ෂේප කිරීමට වඩා එය භාවිතා කළ බව යමෙකු දකින්නේ ඇයිද යන්න පෙනේ. ඒකීය ක්‍රියාකරු! (එසේම ~, - සහ +) ශ්‍රිත ප්‍රකාශයකින් ව්‍යාකූල වන අතර අවසානයේ ඇති පරෙන්සන්ට () ස්ථානයේ ශ්‍රිතය කැඳවීමට ඉඩ දෙයි. මොඩියුලර් කේත ලිවීමේදී විචල්‍යයන් සඳහා දේශීය විෂය පථයක් / නාම අවකාශයක් නිර්මාණය කිරීම සඳහා මෙය බොහෝ විට සිදු කෙරේ.
ටොම් ඔගර්

67
තවත් වාසියක් එයයි! අර්ධ-මහා බඩවැල් ඇතුළු කිරීමකට හේතු වේ, එබැවින් මෙම අනුවාදය a සමඟ අවසන් නොවන ගොනුවක් සමඟ වැරදියට සම්බන්ධ කළ නොහැක;. ඔබට () පෝරමය තිබේ නම්, එය පෙර ගොනුවේ අර්ථ දක්වා ඇති ඕනෑම දෙයක ක්‍රියාකාරී ඇමතුමක් ලෙස සලකනු ඇත. මගේ සම සේවකයෙකුට තොප්පිය ඉඟිය.
ජුරේ ට්‍රිග්ලව්

5
Arn කාර්නික්ස් var foo =ප්‍රකාශය / ප්‍රකාශන නොපැහැදිලි බව බිඳ දැමූ අතර ඔබට සරලව ලිවිය var foo = function(bar){}("baz");හැකිය.
නීල්

6
මෙය දැකීමට කැතයි ... විශ්මයජනක සලකුණ තෝරා ගැනීමට දිගු දුරක් නැත. මෙමගින් සංවර්ධකයාට තත්පරයෙන් භාගයක් ඉතිරි කර ගත හැකි අතර අනෙක් අයට තේරුම් ගැනීමට පැය ගණනක් ගත වේ.
පැබ්ලෝ එසකියෙල් ලියොන්

6
මෙය සාමාන්‍යයෙන් සිදු කරනුයේ සෑම බයිට් එකක්ම ගණනය කරන කුඩා / කැත කිරීමේ ස්ක්‍රිප්ට් මගිනි.
ඩීමා ස්ලිවින්

369

කාර්යය:

function () {}

කිසිවක් ආපසු ලබා නොදේ (හෝ නිර්වචනය නොකළ).

සමහර විට අපි ශ්‍රිතයක් නිර්මාණය කරන විට එය කැඳවීමට අවශ්‍යය. මෙය අත්හදා බැලීමට ඔබ පෙළඹෙනු ඇත:

function () {}()

නමුත් එහි ප්‍රති results ලය a SyntaxError.

!ශ්‍රිතයට පෙර ක්‍රියාකරු භාවිතා කිරීමෙන් එය ප්‍රකාශනයක් ලෙස සලකනු ලැබේ, එබැවින් අපට එය හැඳින්විය හැකිය:

!function () {}()

එමෙන්ම මෙම කාර්යය නැවත වටිනාකම වීජ ප්රතිවිරුද්ධ, මේ අවස්ථාවේ දී ආපසු trueනිසා !undefinedtrue. ඇමතුමේ ප්‍රති result ලය සත්‍ය ප්‍රතිලාභ අගය වීමට ඔබට අවශ්‍ය නම්, එය මේ ආකාරයෙන් කිරීමට උත්සාහ කරන්න:

(function () {})()

28
කවදා හෝ මෙය අවශ්‍ය වන්නේ කාටද?
ඇන්ඩ්‍රි

13
ප්‍රශ්නයේ නඩුව පැහැදිලි කරන එකම පිළිතුර මෙයයි, බ්‍රාවෝ!
ඇන්ඩ්‍රි

14
ඔබගේ දෙවන කේත නියැදිය වලංගු නොවේ ජාවාස්ක්‍රිප්ට්. මෙහි අරමුණ !වන්නේ ශ්‍රිත ප්‍රකාශනය ශ්‍රිත ප්‍රකාශනයක් බවට පත් කිරීමයි, එපමණයි.
Skilldrick

8
Nd ඇන්ඩ්‍රි බූට්ස්ට්‍රැප් ට්විටර් විසින් සියලුම ජාවාස්ක්‍රිප්ට් (jQuery) ප්ලගීන ලිපිගොනු වල මෙය භාවිතා කරයි. අනෙක් අයටද එකම ප්‍රශ්නය තිබිය හැකි අවස්ථාවකදී මෙම අදහස එකතු කිරීම.
අන්මෝල් සරෆ්

2
d3.js ද !functionවාක්‍ය ඛණ්ඩය භාවිතා කරයි
ක්‍රිස්ටියන්

65

Airbnb JavaScript මාර්ගෝපදේශයේ! සලකුණු කර ඇති ශ්‍රිත ආයාචනය සඳහා භාවිතා කිරීමට හොඳ කරුණක් තිබේ

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

!function abc(){}();
!function bca(){}();

ඒ ආකාරයටම ක්‍රියා කරයි

!function abc(){}();
(function bca(){})();

නමුත් එක් අක්‍ෂරයක් ඉතිරි කරන අතර අත්තනෝමතික පෙනුම වඩා හොඳය.

ඕනෑම යන මාර්ගය +, -, ~, voidක්රියාකරුවන් එම බලපෑම, ශ්රිතය කැඳවමින් අනුව, තහවුරු කිරීම සඳහා ඔබ එම කාර්යය සිට ආපසු යමක් භාවිතා කිරීමට නම් වෙනස් ඔවුන් කටයුතු කරන ඇත.

abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?

නමුත් ඔබ එක් ගොනුවක් සඳහා IIFE රටා එක් මොඩියුලයක් කේත වෙන් කිරීම සහ ප්‍රශස්තිකරණය සඳහා කොන්කට් මෙවලම භාවිතා කරන්නේ නම් (එමඟින් එක් පේළියක් එක් ගොනු කාර්යයක් බවට පත් වේ), එවිට ඉදිකිරීම්

!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()

පළමු කේත නියැදියක් සේම ආරක්ෂිත කේත ක්‍රියාත්මක කිරීම සිදු කරයි.

මෙය දෝෂයක් ඇති කරයි ජාවාස්ක්‍රිප්ට් ඒඑස්අයි හට එහි වැඩ කිරීමට නොහැකි වනු ඇත.

!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()

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

මෙය ක්‍රියාත්මක වේ:

!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()

මෙය නොවේ:

^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()

3
ඇත්ත වශයෙන්ම, එම අනෙක් සංකේත එකම බලපෑමක් ඇති නොකරයි. ඔව්, විස්තර කර ඇති පරිදි ශ්‍රිතයක් ඇමතීමට ඒවා ඔබට ඉඩ දෙයි, නමුත් ඒවා සමාන නොවේ. සලකා බලන්න: var foo =! ශ්‍රිතය (තීරුව) {console.debug (තීරුව); }("වවුලා"); ඔබ කුමන සංකේතයක් ඉදිරියෙන් තැබුවද, ඔබේ කොන්සෝලය තුළ "වවුලෙකු" ලැබේ. දැන්, console.debug එක් කරන්න ("foo:", foo); - ඔබ භාවිතා කරන සංකේතය මත පදනම්ව ඔබට වෙනස් ප්‍රති results ල ලැබේ. ! සැමවිටම ප්‍රිය නොවන ප්‍රතිලාභ අගයක් බල කරයි. පැහැදිලිකම සහ නිරවද්‍යතාවය සඳහා මම ({}) () වාක්‍ය ඛණ්ඩයට කැමැත්තෙමි.
කානික්ස්

29

එම ප්‍රකාශය අසත්‍ය ලෙස තක්සේරු කළ හැකිද යන්න එය නැවත ලබා දෙයි. උදා:

!false      // true
!true       // false
!isValid()  // is not valid

බූලියන් සඳහා අගයක් බල කිරීම සඳහා ඔබට එය දෙවරක් භාවිතා කළ හැකිය:

!!1    // true
!!0    // false

එබැවින්, ඔබේ ප්‍රශ්නයට වඩාත් සෘජුවම පිළිතුරු දීමට:

var myVar = !function(){ return false; }();  // myVar contains true

සංස්කරණය කරන්න: එය ශ්‍රිත ප්‍රකාශනය ශ්‍රිත ප්‍රකාශනයකට වෙනස් කිරීමේ අතුරු ආබාධයක් ඇත. උදා: පහත දැක්වෙන කේතය වලංගු නොවේ, මන්ද එය අවශ්‍ය හඳුනාගැනීමක් (හෝ ශ්‍රිතයේ නම ) නොමැති ක්‍රියාකාරී ප්‍රකාශයක් ලෙස අර්ථකථනය කර ඇත :

function () { return false; }();  // syntax error

6
ක්ෂණිකව ආයාචනා කරන ලද ශ්‍රිතයක් සමඟ පැවරුමක් භාවිතා කිරීමට කැමති පා readers කයන් සඳහා පැහැදිලි බව සඳහා, ඔබේ උදාහරණ කේතය var myVar = !function(){ return false; }()ඒ හා !සමාන විය හැකි var myVar = function(){ return false; }()අතර ශ්‍රිතය නිවැරදිව ක්‍රියාත්මක වන අතර ප්‍රතිලාභ අගය ස්පර්ශ නොවනු ඇත.
මාර්ක් ෆොක්ස්

1
පැහැදිලිව කිවහොත්, ඔබට එය වරක් බූලියන් වෙත බල කිරීම සඳහා භාවිතා කළ හැකිය, මන්ද එය තාර්කික නොවන ක්‍රියාකරු ය. ! 0 = සත්‍ය, සහ! 1 = අසත්‍යය. ජාවාස්ක්රිප්ට් minification කටයුතු සඳහා, ඔබට ආදේශ කිරීමට අවශ්ය කියලා trueසමග !0හා falseසමග !1. එය අක්ෂර 2 ක් හෝ 3 ක් ඉතිරි කරයි.
ට්‍රයින්කෝ

9

අපි ජාවාස්ක්‍රිප්ට් අවම කිරීම සිදු කරන විට දත්ත බයිට් එකක් ඉතිරි කිරීම පමණි.

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

function (){}

ඉහත සඳහන් දෑ ස්වයං ආයාචනා කිරීමේ ශ්‍රිතයක් බවට පත් කිරීම සඳහා අපි සාමාන්‍යයෙන් ඉහත කේතය වෙනස් කරන්නෙමු

(function (){}())

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

!function (){}()

තවමත් දෙකම ස්වයං ආයාචනා කිරීමේ කාර්යයන් වන අතර අපි බයිට් එකක්ද ඉතිරි කරමු. අක්ෂර 2 වෙනුවට (,)අපි භාවිතා කළේ එක් අක්‍ෂරයකි!


1
බොහෝ විට ඔබ minified JS මෙම බලන්නම් මේ නිසා ප්රයෝජනවත් වේ
නම සඳහා

6

විශ්මය දනවන සලකුණ ඕනෑම ශ්‍රිතයක් සෑම විටම බූලියන් ආපසු ලබා දෙයි.
අවසාන අගය නම් ශ්‍රිතය මඟින් ආපසු ලබා දුන් අගය ප්‍රතික්ෂේප කිරීමයි.

!function bool() { return false; }() // true
!function bool() { return true; }() // false

සැර බාල !ඉහත උදාහරණ විය හැකි බවට SyntaxError .

function bool() { return true; }() // SyntaxError

කෙසේ වෙතත්, මෙය සාක්ෂාත් කර ගැනීම සඳහා වඩා හොඳ ක්‍රමයක් වනුයේ:

(function bool() { return true; })() // true

මෙය වැරදිය. !ධාවන කාලය ශ්‍රිතය විග්‍රහ කරන ආකාරය වෙනස් කරයි. එමඟින් ධාවන කාලය ශ්‍රිතය ක්‍රියාකාරී ප්‍රකාශනයක් ලෙස සලකයි (ප්‍රකාශයක් නොවේ). එය මෙය කරන්නේ සංවර්ධකයාට ()වාක්‍ය ඛණ්ඩය භාවිතයෙන් වහාම ශ්‍රිතය කැඳවීමටය. !ශ්‍රිත ප්‍රකාශනය ක්‍රියාත්මක කිරීමේ ප්‍රති result ලයට (එනම් ප්‍රතික්ෂේප කිරීම) ද අදාළ වේ.
බෙන් ඇස්ටන්

5

! තාර්කික NOT ක්‍රියාකරු, එය එහි ප්‍රතිවිරුද්ධ දෙසට යමක් හරවන බූලියන් ක්‍රියාකරුවෙකි.

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

ඒ වෙනුවට, අවශ්‍ය නම් සංවෘත වරහන් සහ BANG ( ! ) භාවිතා කරන්න.

// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.

(function(){ return false; }());
=> false

!(function(){ return false; }());
=> true

!!(function(){ return false; }());
=> false

!!!(function(){ return false; }());
=> true

වැඩ කරන වෙනත් ක්‍රියාකරුවන් ...

+(function(){ return false; }());
=> 0

-(function(){ return false; }());
=> -0

~(function(){ return false; }());
=> -1

ඒකාබද්ධ ක්‍රියාකරුවන් ...

+!(function(){ return false; }());
=> 1

-!(function(){ return false; }());
=> -1

!+(function(){ return false; }());
=> true

!-(function(){ return false; }());
=> true

~!(function(){ return false; }());
=> -2

~!!(function(){ return false; }());
=> -1

+~(function(){ return false; }());
+> -1

3

IIFE ලිවීමේ තවත් ක්‍රමයක් (වහාම ක්‍රියාත්මක වන ප්‍රකාශනය).

එහි වෙනත් ලිවීමේ ක්‍රමය -

(function( args ) {})()

සමාන

!function ( args ) {}();

හොඳයි, එය හරියටම සමාන නොවේ; 2 වන පෝරමය ශ්‍රිත ඇමතුමේ ප්‍රති result ලය ප්‍රතික්ෂේප කරයි (ඉන්පසු වටිනාකම් පැවරීමක් නොමැති නිසා එය ඉවතට විසි කරයි). මම වඩාත් පැහැදිලිව (function (args) {...})()වාක්‍ය !functionඛණ්ඩයට දැඩි කැමැත්තක් දක්වන අතර එම පෝරමය අවම කිරීම සහ අපැහැදිලි මෙවලම් වලට තබමි.
ටොබියාස්

-1

! ප්‍රති result ලයක් ලෙස ඔබ අපේක්ෂා කරන ඕනෑම දෙයක් (ප්‍රතිවිරුද්ධ) ප්‍රතික්ෂේප කරනු ඇත, එනම් ඔබට තිබේ නම්

var boy = true;
undefined
boy
true
!boy
false

ඔබ ආරාධනා boy, ඔබේ ප්රතිඵලය වනු true, එහෙත් මේ මොහොතේ ඔබ එකතු !කරන විට boy, එනම්, !boyඔබේ ප්රතිඵලය වනු false. වෙනත් වචන වලින් ඔබ අදහස් කරන්නේ නොට්බෝයි , නමුත් මෙවර එය මූලික වශයෙන් බූලියන් ප්‍රති result ලයකි , trueනැතහොත් false.

!function () {}();ප්‍රකාශනයට සිදු වන දෙයමයි , ධාවනය function () {}();කිරීමෙන් ඔබට දෝෂයක් සලකුණු වනු ඇත, නමුත් !ඔබේ function () {}();ප්‍රකාශනය ඉදිරිපිට දකුණට එකතු කිරීමෙන් function () {}();එය ඔබට ආපසු ලබා දිය යුතු ප්‍රතිවිරුද්ධ දෙය කරයි true. උදාහරණය පහත දැක්වේ:

function () {}();
SyntaxError: function statement requires a name
!function () {}();
true
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.