একই লাইনে আপনাকে বেনামে ফাংশনটি কেন চাওয়া দরকার?


374

ক্লোজার সম্পর্কে আমি কিছু পোস্ট পড়ছিলাম এবং এগুলি সর্বত্র দেখেছি, তবে এটি কীভাবে কাজ করে সে সম্পর্কে কোনও স্পষ্ট ব্যাখ্যা নেই - প্রতিবার আমাকে কেবল এটি ব্যবহার করতে বলা হয়েছিল ...:

// Create a new anonymous function, to use as a wrapper
(function(){
    // The variable that would, normally, be global
    var msg = "Thanks for visiting!";

    // Binding a new function to a global object
    window.onunload = function(){
        // Which uses the 'hidden' variable
        alert( msg );
    };
// Close off the anonymous function and execute it
})();

ঠিক আছে আমি দেখতে পাচ্ছি যে আমরা নতুন বেনামে ফাংশন তৈরি করব এবং তারপরে এটি সম্পাদন করব। সুতরাং এর পরে এই সাধারণ কোডটি কাজ করা উচিত (এবং এটি করে):

(function (msg){alert(msg)})('SO');

আমার প্রশ্ন এখানে কি ধরনের যাদু ঘটে? আমি ভেবেছিলাম যে আমি যখন লিখেছি:

(function (msg){alert(msg)})

তারপরে একটি নতুন নামবিহীন ক্রিয়াকলাপটি "" (msg) এর মতো তৈরি করা হবে ...

তবে কেন এই কাজ করে না?

(function (msg){alert(msg)});
('SO');

কেন এটি একই লাইনে থাকা দরকার?

আপনি কি আমাকে কিছু পোস্ট নির্দেশ করতে পারেন বা আমাকে একটি ব্যাখ্যা দিতে পারেন?


2
অন্যান্য ভাষায় এগুলিকে ফাংশন পয়েন্টার বা প্রতিনিধি বলা হয়, যদি আপনি জড়িত নিম্ন-স্তরের কাঠামোগুলি সন্ধান করতে চান।
ক্রিস মোসচিনি

17
তোমার আছে ; প্রথম লাইনে
অলিভার নি

এখন আপনি জানেন যে এটি কীভাবে কাজ করে ... এটি ব্যবহার করবেন না। আমাদের বেনামে ফাংশন লেখা বন্ধ করা উচিত । আরও কয়েকটি চরিত্রের সাহায্যে আমরা আমাদের ফাংশনগুলিকে একটি আসল নাম দিতে পারি এবং জাভাস্ক্রিপ্ট কোডটি ডিবাগিংকে আরও সহজ করতে পারি!
স্টিজন ডি উইট

1
লাইনটি (function (msg){alert(msg)})('SO');সম্পূর্ণ নিজস্বভাবে কাজ করে। আপনি পোস্ট করেছেন এমন অন্যান্য বেনামি কার্যটির সাথে এর কোনও যোগসূত্র নেই। এগুলি দুটি সম্পূর্ণ পৃথক বেনাম ফাংশন। আপনাকে তাত্ক্ষণিকভাবে একটি বেনামি ফাংশন শুরু করতে হবে কারণ এর কোনও নাম নেই এবং পরে উল্লেখ করা যায় না।
অক্টোপাস

উত্তর:


380

ফাংশন সংজ্ঞার পরে সেমিকোলনটি ফেলে দিন।

(function (msg){alert(msg)})
('SO');

উপরে কাজ করা উচিত।

ডেমো পৃষ্ঠা: https://jsfiddle.net/e7ooeq6m/

আমি এই পোস্টে এই ধরণের প্যাটার্নটি নিয়ে আলোচনা করেছি:

jQuery এবং $ প্রশ্ন

সম্পাদনা করুন:

আপনি যদি ইসিএমএ স্ক্রিপ্টের নির্দিষ্টকরণের দিকে তাকান তবে 3 টি উপায় রয়েছে যে আপনি কোনও ফাংশন সংজ্ঞায়িত করতে পারেন। (পৃষ্ঠা 98, বিভাগ 13 ফাংশন সংজ্ঞা)

1. ফাংশন নির্মাণকারী ব্যবহার করে

var sum = new Function('a','b', 'return a + b;');
alert(sum(10, 20)); //alerts 30

2. ফাংশন ঘোষণা ব্যবহার করে।

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

alert(sum(10, 10)); //Alerts 20;

3. ফাংশন এক্সপ্রেশন

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

alert(sum(5, 5)); // alerts 10

সুতরাং আপনি জিজ্ঞাসা করতে পারেন, ঘোষণা এবং প্রকাশের মধ্যে পার্থক্য কী?

ইসিএমএ স্ক্রিপ্টের নির্দিষ্টকরণ থেকে:

ফাংশনডিক্লেয়ারেশন: ফাংশন আইডেন্টিফায়ার (ফরমালপ্যারামিটারলিস্টপ্ট) {ফাংশনবডি}

ফাংশন এক্সপ্রেশন: ফাংশন আইডেন্টিফায়ারপট (ফর্মালপ্যারামিটারলিস্টপ্ট) {ফাংশনবডি}

লক্ষ্য করলে দেখবেন, 'শনাক্তকারী' হল ঐচ্ছিক ফাংশন প্রকাশের জন্য। এবং যখন আপনি কোনও শনাক্তকারীকে না দেন, আপনি একটি বেনামি ফাংশন তৈরি করেন। এর অর্থ এই নয় যে আপনি কোনও সনাক্তকারী নির্দিষ্ট করতে পারবেন না।

এর অর্থ নিম্নলিখিতটি বৈধ।

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

গুরুত্বপূর্ণ লক্ষণীয় বিষয় হ'ল আপনি 'মাইসাম' কেবল মাইসাম ফাংশন বডির ভিতরে ব্যবহার করতে পারেন, বাইরে নয়। নিম্নলিখিত উদাহরণ দেখুন:

var test1 = function test2() { alert(typeof test2); }

alert(typeof(test2)); //alerts 'undefined', surprise! 

test1(); //alerts 'function' because test2 is a function.

সরাসরি নমুনা

এর সাথে তুলনা করুন

 function test1() { alert(typeof test1) };

 alert(typeof test1); //alerts 'function'

 test1(); //alerts 'function'

এই জ্ঞান দিয়ে সজ্জিত, আসুন আপনার কোডটি বিশ্লেষণ করার চেষ্টা করুন।

যখন আপনার মত কোড থাকে,

    function(msg) { alert(msg); }

আপনি একটি ফাংশন এক্সপ্রেশন তৈরি করেছেন। এবং আপনি এই ক্রিয়াকলাপটি এক্সপ্রেশনটি এটিকে প্রথম বন্ধনে আবদ্ধ করে কার্যকর করতে পারেন।

    (function(msg) { alert(msg); })('SO'); //alerts SO.

1
হ্যাঁ, তবে কেন? কেন এটি একটি ইনলাইন হিসাবে হওয়া প্রয়োজন? আমি কতটা সাদা জায়গা ব্যবহার করব তা বিবেচনাধীন।
পালিগ

9
আমি যেমন লিখেছি, আধা-কোলন বেনামে ফাংশন সংজ্ঞাটি বাতিল করেছে। কারণ এর কোনও নাম নেই (এটি নামবিহীন দুহ!), আপনি আর এটি কল করতে পারবেন না। আপনি যদি সেমিকোলন না রাখেন তবে ফাংশনটি এখনও কার্যকর করা যেতে পারে।
সমাধান

আমি ভেবেছিলাম যে স্বয়ংক্রিয় সেমিকোলন সন্নিবেশ এই ক্ষেত্রে একটি সেমিকোলন স্থাপন করবে, তবে তা হয় না। সুতরাং আপনি ঠিক বলেছেন।
নসরেডনা

1
নোসরেডনা, জেএস যখন আধা কলোন যুক্ত করার কথা আসে তখন কিছুটা স্বেচ্ছায় আচরণ করে। এই বিশদ নিবন্ধটি পড়ুন: blog.boyet.com/blog/javascriptlessons/…
সমাধান

হ্যাঁ আমি দেখতে পাচ্ছি (ফাংশন (msg) {সতর্কতা (চিত্র)}) ('এসও'); কাজ করে। আমি কেবল জিজ্ঞাসা করছিলাম কেন এটি কাজ করে? যেখানে এটি নির্দিষ্ট করা হয়েছে বা এটি কী ধরণের জেএস বৈশিষ্ট্য। সুতরাং একবার আমি কেবল কল করেছি: (ফাংশন (msg) {সতর্কতা (চিত্র)}) ফাংশনটির সাথে কী হবে? এটি জিসিড হবে?
পালিগ

129

একে স্ব-চালিত ফাংশন বলে।

আপনি যখন কল করবেন তখন যা করছেন তা (function(){})কোনও ফাংশন অবজেক্টকে ফিরিয়ে দিচ্ছে । আপনি যখন এতে যুক্ত ()হন, এটি আহ্বান করা হয় এবং শরীরে যে কোনও কিছুই কার্যকর করা হয়। ;বিবৃতির শেষ উল্লেখ করে, যে কেন 2nd আবাহন ব্যর্থ।


আহ ঠিক আছে, তাই আমি ঠিক কিছু বিশেষ জেএস সিনট্যাক্স, তাই না? এই ব্যাখ্যাটি সবচেয়ে বেশি পছন্দ করুন! সহজ এবং সংক্ষিপ্ত :)
পালিগ

আমার মনে হয় যে শরীরটি 'বিস্মৃত' হবে তা বলা ভুল। এটি অন্য কোনও ফাংশনের মতোই সম্পাদন করে। কারণ এটি বেনামে রয়েছে, হয় আপনি কোথাও রেফারেন্সটি সংরক্ষণ করুন বা এটি এখনই সম্পাদন করুন।
সমাধান

16
ব্যক্তিগতভাবে, আমি 'স্ব-চাওয়া ফাংশন' শব্দটিও পছন্দ করি না। এটি যে ফাংশন নিজেই প্রার্থনা করছে না। প্রোগ্রামার সেগুলি শুরু করার জন্য সেই প্রথম বন্ধনী লিখেছিল।
SolutionYogi

এটি বিশেষ যে কোনও কিছুর চেয়ে "বিশেষ বাক্য গঠন" নয়। আসলে, "ফাংশন নাম (আরগস) {ব্লক form" ফর্মটি অনেক বেশি "বিশেষ"। এটি আসলে অপ্রয়োজনীয় চিনি; এটি আসলে জিনিসগুলি ঘটায়।
jrockway

2
নিবন্ধ সুন্দর লিঙ্ক। এটি নোট করে কেন কেউ এই উদ্ধৃতি ব্যবহার করবে: "বিশ্বব্যাপী অবজেক্টটি সুরক্ষার প্রয়াসে সমস্ত জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন একটি স্ব-আহ্বানমূলক ফাংশনের মধ্যে লেখা উচিত This এটি এমন একটি অ্যাপ্লিকেশন সুযোগ তৈরি করবে যাতে ভেরিয়েবলগুলি তাদের সংঘর্ষের ভয় ছাড়াই তৈরি করা যায় in অন্যান্য অ্যাপ্লিকেশন সহ। " এবং আরও উল্লেখ করেছে "একবার ফাংশনটি শেষ হয়ে গেলে, ভেরিয়েবলগুলি বাতিল করে দেওয়া হবে এবং বিশ্বব্যাপী অবজেক্ট অপরিবর্তিত থাকবে।"
হ্যাডিক্সন

94

আমি একটি বিভ্রান্তিকর বিষয় খুঁজে পেলাম যে "()" গ্রুপিং অপারেটর।

এখানে আপনার বেসিক ঘোষিত ফাংশন।

যাত্রা। 1:

var message = 'SO';

function foo(msg) {
    alert(msg);
}

foo(message);

ফাংশনগুলি হ'ল বস্তু এবং গোষ্ঠীভুক্ত করা যেতে পারে। সুতরাং আসুন ফাংশন কাছাকাছি পেরেন নিক্ষেপ করা যাক।

যাত্রা। 2:

var message = 'SO';

function foo(msg) {  //declares foo
    alert(msg);
}

(foo)(message);     // calls foo

এখন একই ক্রিয়াকলাপটিকে ডাকা এবং ডানদিকের পরিবর্তে কল করার পরিবর্তে আমরা একে কল করার সাথে সাথে এটি ঘোষণা করার জন্য বেসিক বিকল্প ব্যবহার করতে পারি।

যাত্রা। 3।

var message = 'SO';

(function foo(msg) {
    alert(msg);
})(message);          // declares & calls foo

শেষ পর্যন্ত, আমাদের সেই অতিরিক্ত ফু-র দরকার নেই কারণ আমরা নামটি কল করার জন্য ব্যবহার করছি না! কাজগুলি বেনামে থাকতে পারে।

যাত্রা। 4।

var message = 'SO';

(function (msg) {   // remove unnecessary reference to foo
    alert(msg);
})(message);

আপনার প্রশ্নের উত্তর দিতে, উদাহরণ 2 দেখুন Your আপনার প্রথম লাইনটি কিছু নামহীন ফাংশন ঘোষণা করে এবং এটি গোষ্ঠীভূত করে, কিন্তু এটি কল করে না। দ্বিতীয় লাইনের একটি স্ট্রিং গ্রুপ করে। দুজনই কিছু করে না। (ভিনসেন্টের প্রথম উদাহরণ।)

(function (msg){alert(msg)});  
('SO');                       // nothing.

(foo); 
(msg); //Still nothing.

কিন্তু

(foo)
(msg); //works

6
ধন্যবাদ। আপনার উদাহরণগুলি বেশ পরিষ্কার ছিল। আমি অসচেতন ছিলাম যে জাভাস্ক্রিপ্টের প্রথম বন্ধনীগুলি কোডটির অর্থ এভাবে পরিবর্তন করতে পারে। আমি একটি জাভা ব্যাকগ্রাউন্ড থেকে এসেছি, তাই আমি প্রায় প্রতিদিন এটি ব্যবহার করে জাভাস্ক্রিপ্ট সম্পর্কে নতুন কিছু (এবং প্রায়শই অপ্রত্যাশিত) শিখি।
হটশট 309

5
ধাপে ধাপে এটি করার জন্য ধন্যবাদ, এটি আমার দেখা অন্য যে কোনও ব্যাখ্যা থেকে ভাল। +1
Wk_of_Angmar

2
মেজর এএএচএ মুহুর্ত- এবং প্রতিস্থাপনের সাথে চিত্রিত করার জন্য আপনাকে ধন্যবাদ +100
ফ্রেড দ্য ওয়েইগগুই

1
বেনাম ফাংশন সম্পর্কে আমি যে সর্বোত্তম ব্যাখ্যা পড়েছি One অনেক ধন্যবাদ!
টেকনোটিকা

23

বেনামে ফাংশন "" নামের কোনও ফাংশন নয়। এটি কেবল নাম ছাড়া একটি ফাংশন।

জাভাস্ক্রিপ্টের অন্য কোনও মানের মতো, কোনও ক্রিয়াকলাপের নাম তৈরি করার প্রয়োজন নেই। যদিও এটি অন্য মানের মতো ঠিক একটি নামের সাথে বাঁধাই আরও বেশি কার্যকর।

তবে অন্য যে কোনও মানের মতো আপনিও কখনও কখনও এটি কোনও নামকে আবদ্ধ না করে ব্যবহার করতে চান। এটি স্ব-চালিত প্যাটার্ন।

এখানে একটি ফাংশন এবং একটি সংখ্যা রয়েছে, আবদ্ধ নয়, এগুলি কিছুই করে না এবং কখনও ব্যবহার করা যায় না:

function(){ alert("plop"); }
2;

সুতরাং আমাদের অন্যান্য ভ্যালুর মতো এগুলি ব্যবহার করতে সক্ষম করতে তাদের একটি ভেরিয়েবলে সংরক্ষণ করতে হবে:

var f = function(){ alert("plop"); }
var n = 2;

আপনি ভেরিয়েবলের সাথে কাজটি বাঁধতে সিনট্যাটিক চিনিও ব্যবহার করতে পারেন:

function f(){ alert("plop"); }
var n = 2;

তবে যদি তাদের নামকরণের প্রয়োজন হয় না এবং আরও বিভ্রান্তি এবং কম পাঠযোগ্যতার দিকে নিয়ে যায় তবে আপনি এখনই এগুলি ব্যবহার করতে পারেন।

(function(){ alert("plop"); })(); // will display "plop"
alert(2 + 3); // will display 5

এখানে, আমার ফাংশন এবং আমার সংখ্যাগুলি একটি ভেরিয়েবলের সাথে আবদ্ধ নয়, তবে সেগুলি এখনও ব্যবহার করা যেতে পারে।

এটি বলেছে, দেখে মনে হচ্ছে স্ব-আমন্ত্রণমূলক ক্রিয়াকলাপটির কোনও আসল মূল্য নেই। তবে আপনাকে মনে রাখতে হবে যে জাভাস্ক্রিপ্ট স্কোপ ডিলিমিটারটি ফাংশন এবং ব্লক নয় ({})।

সুতরাং একটি স্ব-আমন্ত্রণমূলক ক্রিয়াকলাপটি আসলে সি ++, সি # বা জাভা ব্লকের মতো একই অর্থ। যার অর্থ হল যে ভেরিয়েবলটি ভিতরে তৈরি হয়েছে তা সুযোগের বাইরে "ফাঁস" হবে না। এটি বিশ্বব্যাপী সুযোগকে দূষিত না করার জন্য জাভাস্ক্রিপ্টে খুব দরকারী।


চমৎকার পোস্ট. এরপরে 'ফাংশন () {সতর্কতা ("প্লপ") দিয়ে কী হবে; } 'আমি কখন এটি সম্পাদন করেছি? এটি জিসিড হবে?
পালিগ

2
ফাংশন () {সতর্কতা ("প্লপ"); । নির্দেশনা কেবল ফাংশন বরাদ্দ করে তবে তা কার্যকর করে না এবং এটিকে একটি ভেরিয়েবলের সাথে আবদ্ধ করে না। যেহেতু তৈরি ফাংশনটি কোনও ভেরিয়েবলের সাথে আবদ্ধ নয়, এটি দ্রুত GCed হবে।
ভিনসেন্ট রবার্ট

এই SO থ্রেডটি আমরা এখানে যা বলছি তার পরিধি ছাড়িয়ে যায়, তবে এটি জাভাস্ক্রিপ্ট নেমস্পেসগুলি পৃথক করার উপায়গুলি ব্যাখ্যা করে - এবং এমন উদাহরণ রয়েছে যা স্ব-চালিত ফাংশনগুলি ব্যবহার করে।
হটশট 309

19

এটি ঠিক কিভাবে জাভাস্ক্রিপ্ট কাজ করে। আপনি একটি নামকৃত ফাংশন ঘোষণা করতে পারেন:

function foo(msg){
   alert(msg);
}

এবং এটি কল:

foo("Hi!");

বা, আপনি একটি বেনামী ফাংশন ঘোষণা করতে পারেন:

var foo = function (msg) {
    alert(msg);
}

এবং এটি কল:

foo("Hi!");

বা, আপনি কখনই কোনও নামের সাথে ফাংশনটি আবদ্ধ করতে পারবেন না:

(function(msg){
   alert(msg);
 })("Hi!");

ফাংশনগুলি ফাংশনগুলিও ফিরিয়ে দিতে পারে:

function make_foo() {
    return function(msg){ alert(msg) };
}

(make_foo())("Hi!");

এটির কোনও মূল্য নেই যে শরীরে "var" দিয়ে সংজ্ঞায়িত কোনও ভেরিয়েবলগুলি make_fooপ্রতিটি ফাংশন দ্বারা ফিরে আসা দ্বারা বন্ধ হয়ে যাবে make_foo। এটি একটি বন্ধ, এবং এর অর্থ হ'ল এক ফাংশন দ্বারা মানটিতে যে কোনও পরিবর্তন হয়েছে তা অন্যের দ্বারা দৃশ্যমান হবে।

আপনি যদি চান তবে এটি আপনাকে তথ্য সজ্জিত করতে দেয়:

function make_greeter(msg){
    return function() { alert(msg) };
}

var hello = make_greeter("Hello!");

hello();

এটি প্রায় প্রতিটি প্রোগ্রামিং ভাষা তবে জাভা কীভাবে কাজ করে তা ঠিক।


8

আপনি যে কোডটি দেখান,

(function (msg){alert(msg)});
('SO');

দুটি বিবৃতি নিয়ে গঠিত । প্রথমটি হ'ল একটি অভিব্যক্তি যা কোনও ফাংশন অবজেক্ট দেয় (যা পরে সংরক্ষণ করা হয়নি বলে আবর্জনা সংগ্রহ করা হবে)। দ্বিতীয়টি হল একটি অভিব্যক্তি যা একটি স্ট্রিং দেয়। স্ট্রিংটিতে ফাংশনটি প্রয়োগ করতে, হয় স্ট্রিংটি তৈরি হওয়ার সময় ফাংশনের আর্গুমেন্ট হিসাবে পাস করতে হবে (যা আপনি উপরেও দেখান), অথবা আপনাকে আসলে একটি ভেরিয়েবলের মধ্যে ফাংশনটি সংরক্ষণ করতে হবে, যাতে আপনি পারেন আপনার অবসর সময়ে এটি পরে প্রয়োগ করুন। তাই ভালো:

var f = (function (msg){alert(msg)});
f('SO');

নোট করুন যে কোনও ভেরিয়েবলে একটি বেনামি ফাংশন (ল্যাম্বডা ফাংশন) সংরক্ষণ করে আপনি কার্যকরভাবে এটিকে একটি নাম দিচ্ছেন। সুতরাং আপনি ঠিক পাশাপাশি একটি নিয়মিত ক্রিয়া সংজ্ঞায়িত করতে পারেন:

function f(msg) {alert(msg)};
f('SO');

7

পূর্ববর্তী মন্তব্যের সংক্ষিপ্তসার:

function() {
  alert("hello");
}();

যখন কোনও ভেরিয়েবলকে বরাদ্দ করা হয় না তখন একটি সিনট্যাক্স ত্রুটি পাওয়া যায়। কোডটি একটি ফাংশন স্টেটমেন্ট (বা সংজ্ঞা) হিসাবে পার্স করা হয়েছে, যা সমাপ্তি বন্ধনীগুলি সিন্টেক্সিকভাবে ভুল উপস্থাপন করে। ফাংশন অংশের চারপাশে বন্ধনী যুক্ত করা দোভাষী (এবং প্রোগ্রামার) কে বলে যে এটি একটি ফাংশন এক্সপ্রেশন (বা প্রার্থনা)

(function() {
  alert("hello");
})();

এটি একটি স্ব-আমন্ত্রণমূলক ফাংশন, যার অর্থ এটি বেনামে তৈরি করা হয়েছিল এবং তাত্ক্ষণিকভাবে চালিত হয় কারণ অনুরোধটি একই লাইনে যেখানে এটি ঘোষিত হয় সেখানে ঘটে। এই আত্ম-invoking ফাংশন একটি নো-যুক্তি ফাংশন কল পরিচিত সিনট্যাক্স দিয়ে নির্দেশ করা হয়, প্লাস ফাংশনের নাম প্রায় যোগ প্রথম বন্ধনী: (myFunction)();

নেই একটি ভাল তাই আলোচনা জাভাস্ক্রিপ্ট ফাংশন সিনট্যাক্স


3

এই উত্তরটি প্রশ্নের সাথে কঠোরভাবে সম্পর্কিত নয়, তবে এই ধরনের সিনট্যাক্স বৈশিষ্ট্যটি ফাংশনগুলির ক্ষেত্রে বিশেষ নয় বলে আপনি জানতে আগ্রহী হতে পারেন। উদাহরণস্বরূপ, আমরা সর্বদা এর মতো কিছু করতে পারি:

alert(
    {foo: "I am foo", bar: "I am bar"}.foo
); // alerts "I am foo"

ফাংশন সম্পর্কিত। যেহেতু তারা অবজেক্টস, যা ফাংশন.প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, আমরা এর মতো কাজ করতে পারি:

Function.prototype.foo = function () {
    return function () {
        alert("foo");
    };
};

var bar = (function () {}).foo();

bar(); // alerts foo

এবং আপনি জানেন যে, এমনকি এগুলি কার্যকর করার জন্য আমাদের প্রথম বন্ধনীর সাথে ফাংশনগুলিও ঘিরে রাখতে হবে না। যাইহোক, যতক্ষণ না আমরা ফলাফলটি একটি ভেরিয়েবলের কাছে নির্ধারণের চেষ্টা করি।

var x = function () {} (); // this function is executed but does nothing

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

আর একটি কাজ যা আপনি ফাংশনগুলির সাথে করতে পারেন, আপনি তাদের ঘোষণার সাথে সাথে তাদের newউপর অপারেটরকে অনুরোধ করা এবং কোনও বস্তু অর্জন করা। নিম্নলিখিত সমতুল্য:

var obj = new function () {
    this.foo = "bar";
};

var obj = {
    foo : "bar"
};

3

জাভাস্ক্রিপ্ট ফাংশনটির আরও একটি সম্পত্তি রয়েছে। আপনি যদি একই বেনাম ফাংশনটি পুনরাবৃত্তভাবে কল করতে চান।

(function forInternalOnly(){

  //you can use forInternalOnly to call this anonymous function
  /// forInternalOnly can be used inside function only, like
  var result = forInternalOnly();
})();

//this will not work
forInternalOnly();// no such a method exist

2
+1 একটি ছোট্ট নমুনা যুক্ত করেছে যাতে এটি পরিষ্কার হয় :-) প্রথমবার এটি পড়ার পরে আমাকে 4 বার পুনরায় পড়তে হয়েছিল।
xanatos

3

প্রশ্নকারীর প্রশ্নের সম্পর্কে আমার বোধগম্যতা এমন:

এই যাদুটি কীভাবে কাজ করে:

(function(){}) ('input')   // Used in his example

আমার ভুল হতে পারে. তবে, লোকেরা যে সাধারণ অনুশীলনের সাথে পরিচিত তা হ'ল:

(function(){}('input') )

কারণটি এমন যে জাভাস্ক্রিপ্ট একে একে বন্ধনী আবদ্ধ করে (), বিবৃতি ধারণ করতে পারে না এবং যখন পার্সার ফাংশন কীওয়ার্ডটির মুখোমুখি হয়, তখন এটি কোনও ফাংশন ঘোষণার জন্য নয়, এটি একটি ফাংশন এক্সপ্রেশন হিসাবে পার্স করতে জানে।

উত্স: ব্লগ পোস্ট অবিলম্বে-আমন্ত্রিত ফাংশন এক্সপ্রেশন (IIFE)


3

বন্ধনী ছাড়া উদাহরণ:

void function (msg) { alert(msg); }
('SO');

(এটি শূন্যতার একমাত্র আসল ব্যবহার, আফাইক)

অথবা

var a = function (msg) { alert(msg); }
('SO');

অথবা

!function (msg) { alert(msg); }
('SO');

পাশাপাশি কাজ। voidনিয়োগ এবং ঠুং যেমন অভিব্যক্তি নির্ণয় করা হয় যার ফলে, পাশাপাশি। গত এক সাথে কাজ করে ~, +, -, delete, typeof, ইউনারী অপারেটরদের কিছু ( voidপাশাপাশি অন্যতম)। কাজ করছে না couse হয় ++, --কারণ একটি ভেরিয়েবলের প্রয়োজন হয়।

লাইন বিরতি প্রয়োজন হয় না।


@ বার্গি ie11 deleteকাজ করে। এমনকি সাথে 'use strict';। এটিও কাজ করে:delete (3 + 4);
নিনা শোলজ

উফফফফ, আমার ভুল। " ২) প্রকার (রেফ) যদি উল্লেখ না হয় তবে সত্য হয়ে যান " "এটি কেবল অযোগ্য সমাধানযোগ্য প্রকৃত উল্লেখগুলির জন্য ত্রুটি নিক্ষেপ করে।
বার্গি

1

এটি একটি স্ব-কার্যকরকারী বেনামি কার্য। প্রথম বন্ধনীর এক্সিকিউট করা এক্সপ্রেশন থাকে এবং দ্বিতীয় সেট বন্ধনীর মধ্যে এই এক্সপ্রেশন কার্যকর করা হয়।

(function () {
    return ( 10 + 20 );
})();

পিটার ম্যাকাক্স প্যারেন্টেসিসের একটি গুরুত্বপূর্ণ জুটির পার্থক্যটি নিয়ে আলোচনা করেছেন ।

প্যারেন্ট নেমস্পেস থেকে ভেরিয়েবলগুলি লুকানোর চেষ্টা করার সময় এটি একটি দরকারী নির্মাণ const ফাংশনের অভ্যন্তরের সমস্ত কোড ফাংশনের ব্যক্তিগত স্কোপের মধ্যে রয়েছে যার অর্থ এটি ফাংশনের বাইরে থেকে একেবারেই অ্যাক্সেস করা যায় না, এটি সত্যই ব্যক্তিগত করে তোলে।

দেখা:

  1. বন্ধ (কম্পিউটার বিজ্ঞান)
  2. জাভাস্ক্রিপ্ট নেমস্পেসিং
  3. জাভাস্ক্রিপ্ট প্যারেন্টেসিসের গুরুত্বপূর্ণ জুটি

0

আর একটি দৃষ্টিভঙ্গি

প্রথমত, আপনি একটি বেনামী ফাংশন ঘোষণা করতে পারেন:

var foo = function(msg){
 alert(msg);
}

তারপরে আপনি এটি কল করুন:

foo ('Few');

কারণ foo = ফাংশন (msg) {সতর্কতা (#);} যাতে আপনি foo কে প্রতিস্থাপন করতে পারেন :

function(msg){
 alert(msg);
} ('Few');

পার্স করার সময় ডিক্লেয়ারিং ফাংশনটির সিনট্যাক্স ত্রুটি এড়াতে আপনার ব্রেসেসের জুড়ে আপনার পুরো বেনাম ফাংশনটি আবদ্ধ করা উচিত। তারপর আমাদের আছে,

(function(msg){
 alert(msg);
}) ('Few');

এইভাবে, এটি আমার পক্ষে সহজ বোঝা যায়।


0

আপনি যখন করেছেন:

(function (msg){alert(msg)});
('SO');

('SO')সেমিকোলনের কারণে আপনি আগে ফাংশনটি শেষ করেছেন । আপনি যদি শুধু লিখেন:

(function (msg){alert(msg)})
('SO');

এটা কাজ করবে।

কার্যকারী উদাহরণ: http://jsfiddle.net/oliverni/dbVjg/


0

এটি কাজ না করার সহজ কারণটি ;বেনামি ফাংশনটির সমাপ্তি নির্দেশ করে না। কারণ কোনও ()ফাংশন কল শেষ না করে এটি কোনও ফাংশন কল নয়। এটাই,

function help() {return true;}

আপনি যদি কল করেন result = help();এটি কোনও ফাংশনে কল এবং সত্যে ফিরে আসবে।

আপনি যদি কল করেন result = help;তবে এটি কল নয়। এটি এমন একটি অ্যাসাইনমেন্ট যেখানে ফলাফলকে নির্ধারিত হ'ল ডেটার মতো সহায়তা করা হয়।

আপনি যা করেছিলেন সেমিমিকলন যোগ করে একটি বেনামী ফাংশন ঘোষণা / তাত্ক্ষণিক করছিল,

(function (msg) { /* Code here */ });

এবং তারপরে একে অন্য বিবৃতিতে কেবল বন্ধনী ব্যবহার করে ডাকার চেষ্টা করেছিলেন ... স্পষ্টতই কারণ ফাংশনটির কোনও নাম নেই তবে এটি কাজ করবে না:

('SO');

দোভাষী দ্বিতীয় লাইনে প্রথম বন্ধনীর এক নতুন নির্দেশ / বিবৃতি হিসাবে দেখেন এবং এটি কাজ করে না, এমনকি যদি আপনি এটি এটি করে থাকেন:

(function (msg){/*code here*/});('SO');

এটি এখনও কাজ করে না, তবে আপনি যখন সেমিকোলনটি সরিয়ে ফেলেন তখন এটি কাজ করে কারণ দোভাষা সাদা স্থান এবং ক্যারিেজ উপেক্ষা করে এবং সম্পূর্ণ কোডটিকে একটি বিবৃতি হিসাবে দেখেন।

(function (msg){/*code here*/})        // This space is ignored by the interpreter
('SO');

উপসংহার: একটি ফাংশন কল ()শেষ না হওয়া ছাড়া কোনও ফাংশন কল নয় যদি না নির্দিষ্ট শর্তে যেমন অন্য কোনও ফাংশন দ্বারা আহ্বান করা হয়, অর্থাত্, বন্ধনীর অন্তর্ভুক্ত না হলেও অনলোড = 'সহায়তা' সহায়তা ফাংশনটি সম্পাদন করে। আমি বিশ্বাস করি সেটটাইমআউট এবং সেটআইন্টারওয়াল এই ধরণের ফাংশন কলকেও মঞ্জুরি দেয় এবং আমি আরও বিশ্বাস করি যে অনুবাদক পর্দার পিছনে প্রথম বন্ধনী যুক্ত করেন যা আমাদের "ফিরিয়ে আনা কল বন্ধন ছাড়া ফাংশন কল নয়"।


আমি বুঝতে পারছি না কেন এটি এতগুলি নিম্নবর্ণ পেয়েছে। আমি মনে করি এটি একটি গ্রহণযোগ্য উত্তর? : /
ড্যানিয়েল চেউং

0
(function (msg){alert(msg)})
('SO');

এটি অনেকগুলি জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক ব্যবহার করে বন্ধ হিসাবে অনামী ফাংশনটি ব্যবহার করার একটি সাধারণ পদ্ধতি।

কোডটি সংকলন করা হলে এই ফাংশনটি স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়।

যদি ;প্রথম লাইনে স্থাপন করা হয়, সংকলকটি এটি দুটি আলাদা লাইন হিসাবে বিবেচনা করে। সুতরাং আপনি উপরের মত একই ফলাফল পেতে পারবেন না।

এটি এই হিসাবে লেখা যেতে পারে:

(function (msg){alert(msg)}('SO'));

আরও বিশদের জন্য জাভাস্ক্রিপ্ট / অজ্ঞাতনামা কার্যাদি দেখুন


যতদূর আমি জানি, জাভাস্ক্রিপ্ট "সংকলন" করে না
ড্যানিয়েল চেং

0
  1. বেনামে ফাংশন হ'ল ফাংশন যা রানটাইম সময়ে গতিশীলভাবে ঘোষিত হয়। এগুলিকে বেনামে ফাংশন বলা হয় কারণ সাধারণ ফাংশনগুলির মতো তাদের কোনও নাম দেওয়া হয়নি।

    বেনামে ফাংশনগুলি ফাংশন ঘোষণার পরিবর্তে ফাংশন অপারেটর ব্যবহার করে ঘোষণা করা হয়। আপনি কোনও নতুন ফাংশন তৈরি করতে ফাংশন অপারেটরটি ব্যবহার করতে পারেন যেখানেই এটির মত প্রকাশের জন্য বৈধ। উদাহরণস্বরূপ আপনি কোনও ফাংশন কলের পরামিতি হিসাবে বা অন্য কোনও জিনিসের সম্পত্তি বরাদ্দ করতে একটি নতুন ফাংশন ঘোষণা করতে পারেন।

    নামযুক্ত ফাংশনের একটি সাধারণ উদাহরণ এখানে:

    ফাংশন ফ্লাইটটোমুন () {সতর্কতা ("জুম! জুম! জুম!"); } flyToTheMoon (); বেনামে ফাংশন হিসাবে তৈরি একই উদাহরণ এখানে:

    var flyToTheMoon = ফাংশন () {সতর্কতা ("জুম! জুম! জুম!"); } flyToTheMoon ();

    বিস্তারিত জানার জন্য এখানে পড়ুন:

    http://helephant.com/2008/08/23/javascript-anonymous-functions/


0

আইআইএফই কেবলমাত্র ফাংশনটি ভাগ করে দেয় এবং msgভেরিয়েবলটি লুকিয়ে রাখে যাতে বিশ্বব্যাপী নাম স্থান "দূষিত" না করে। বাস্তবে, কেবল এটিকে সহজ রাখুন এবং নীচের মতো করুন যতক্ষণ না আপনি একটি বিলিয়ন ডলারের ওয়েবসাইট তৈরি করছেন।

var msg = "later dude";
window.onunload = function(msg){
  alert( msg );
};

আপনি যেমন প্রকাশের মডিউল প্যাটার্নmsg ব্যবহার করে আপনার সম্পত্তিটির নাম স্থান দিতে পারেন:

var myScript = (function() {
    var pub = {};
    //myscript.msg
    pub.msg = "later dude";
    window.onunload = function(msg) {
        alert(msg);
    };
    //API
    return pub;
}());

-1

বেনামে ফাংশন বলতে বোঝানো হয় একটি শট চুক্তি যেখানে আপনি ফ্লাইতে কোনও ফাংশন সংজ্ঞায়িত করেন যাতে এটি আপনার সরবরাহ করা কোনও ইনপুট থেকে আপনার আউটপুট উত্পন্ন করে। আপনি ইনপুট সরবরাহ করেন নি তা বাদে। পরিবর্তে, আপনি দ্বিতীয় লাইনে কিছু লিখেছিলেন ('এসও'); - একটি স্বাধীন বিবৃতি যা ফাংশন সঙ্গে কোন সম্পর্ক নেই। তুমি কি আশা কর? :)


100% সঠিক নয়। এই পাশাপাশি একটি বেনামী ফাংশন ও পুনঃব্যবহার করা বোঝানো হয়: var foo = function() {};। অন্য সব কিছু যদিও ঠিক আছে।
ফেলিক্স ক্লিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.