বেনামে জাভাস্ক্রিপ্ট ফাংশনগুলি স্বয়ংক্রিয়ভাবে সম্পাদন করার জন্য প্রথম বন্ধনের অবস্থান?


107

আমি সম্প্রতি আমার প্রকল্পে আমার সংস্করণটির সাথে json2.js এর বর্তমান সংস্করণটির তুলনা করছি এবং কীভাবে ফাংশন এক্সপ্রেশন তৈরি হয়েছিল এবং স্ব সম্পাদিত হয়েছিল তার মধ্যে একটি পার্থক্য লক্ষ্য করেছি।

কোড বন্ধনীতে একটি বেনাম ফাংশন মোড়ানোর জন্য ব্যবহৃত হয় এবং তারপরে এটি সম্পাদন করে,

(function () {
  // code here
})();

তবে এখন এটি প্যারেন্টেসিসে স্বয়ংক্রিয়ভাবে চালিত ফাংশনটি মোড়ানো।

(function () {
  // code here
}());

সেখানে গৃহীত উত্তরে CMS দ্বারা একটি মন্তব্য ব্যাখ্যা কর জাভাস্ক্রিপ্ট এর encapsulated বেনামী ফাংশন সিনট্যাক্স যে, "উভয়: (function(){})();এবং (function(){}());। বৈধ"

আমি ভাবছিলাম কি পার্থক্য? প্রাক্তন কী কোনও গ্লোবাল, বেনামে ফাংশন রেখে স্মৃতি গ্রহণ করেন? প্রথম বন্ধনী কোথায় অবস্থিত করা উচিত?




1
এছাড়াও এই নির্মাণের উদ্দেশ্য সম্পর্কে পড়ুন , বা একটি ( প্রযুক্তিগত ) ব্যাখ্যা ( এখানেও ) পরীক্ষা করুন। প্রথম বন্ধনী কেন প্রয়োজনীয়, এই প্রশ্নটি দেখুন
বার্গি

উত্তর:


66

তারা কার্যত একই।

প্রথমটিকে কোনও বৈধ অভিব্যক্তি হিসাবে তৈরি করার জন্য একটি ক্রিয়াকলাপের চারপাশে প্যারেন্টেসিসগুলি মোড়ানো হয়। অভিব্যক্তির ফলাফল অনির্ধারিত।

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

আমি মনে করি না যে এটি করার একটি "সঠিক" উপায় আছে, যেহেতু প্রকাশের ফলাফল একই।

> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"

8
জেএসলিন্ট চায় "(ফাংশন () {} ());"। জেএসলিন্ট বলেছেন, "ফাংশনটি উপস্থিত প্যারেন্সগুলিতে আমন্ত্রণটি সরান।"
এক্সপি 1

27
আসলে আপনি ঐ দুই সীমাবদ্ধ নয়, আপনি শুধু যে কিছু কম্পাইলার অনুভব ফাংশন একটি অভিব্যক্তি অংশ এবং যেমন একটি বিবৃতি তোলে সম্পর্কে ব্যবহার করতে পারেন +function(){}()বা !function(){}()
টিজিআর

49
@ এক্সপি 1: জেএসলিন্ট প্রচুর পরিমাণে চান যা ক্রকফোর্ডের স্টাইলের সাথে সুনির্দিষ্ট হওয়ার পরিবর্তে নির্দিষ্ট । এই হল তাদের একজন।
টিজে ক্রাউডার

@TJCrowder। আপনি কি সুপারিশ করতেন? jQuery প্রথম স্টাইল ব্যবহার করে এবং ক্রকফোর্ড দ্বিতীয়টি ব্যবহার করে।
তেজ

4
@ থরপোবাবাজি: সত্যিকার অর্থে এটি কোনও বিষয় নয়, তাই আপনি যা পছন্দ করেন তা করুন। আমি আরও কিছু আউটরেসের বিরুদ্ধে সুপারিশ করব ( -function(){}();, !function(){}();এবং মূলত অন্য কোনও অপারেটরও functionকাজ করার ঠিক আগে , তবে আমি পেরেন্স ব্যবহার করে সংস্করণগুলিতে আটকে থাকব)। দ্বিতীয়টি দেখতে আমি প্রথমটিকে অনেক বেশি দেখি এবং এটি আমার পছন্দ; এটি আমার কাছে আরও বোধগম্য হয় তবে এটি বিষয়গত। এফডাব্লুআইডাব্লু
টিজে ক্রাউডার

13

সেক্ষেত্রে তাতে কিছু আসে যায় না। আপনি একটি সংজ্ঞাটি প্রেরণ করছেন যা প্রথম সংজ্ঞাতে কোনও ফাংশনের সমাধান করে এবং দ্বিতীয় উদাহরণে কোনও ফাংশন সংজ্ঞায়িত করে এবং তত্ক্ষণাত্ অনুরোধ করছে। তারা অনুরূপ কারণ প্রথম উদাহরণে ফাংশন প্রকাশটি কেবল ফাংশন সংজ্ঞা।

আহ্বানমূলক এক্সপ্রেশনগুলির জন্য আরও স্পষ্টতই দরকারী কেসগুলি যা কার্যগুলি স্থির করে:

(foo || bar)()

3
অন্যান্য পাঠকদের কাছে স্পষ্টতার জন্য (মূলত আমি প্রথমে এটি বুঝতে পারি নি :)), foo এবং / অথবা বারটিকে ইতিমধ্যে কিছু ফাংশনের সমান করতে হবে। (উদা foo = function(){alert('hi');}। উভয়ই যদি কোনও ফাংশন না হয় তবে একটি ত্রুটি নিক্ষিপ্ত হয়
আলেকজান্ডার বার্ড

3
@ আলেকজান্ডারবার্ড আরও একটি স্পেসিফিকেশন - foo"সত্যবাদী" তবে কোনও ফাংশন না হলে এটি ত্রুটিও ছুঁড়ে দেবে ।
জেএলরিশ

9

সিনট্যাক্সের বাইরে কোনও পার্থক্য নেই।

এটি করার দ্বিতীয় পদ্ধতি সম্পর্কে আপনার উদ্বেগ সম্পর্কিত:

বিবেচনা:

(function namedfunc () { ... }())

namedfuncআপনি নামটি সরবরাহ করলেও এখনও বিশ্বব্যাপী সুযোগে থাকবে না। বেনামী ফাংশনগুলির জন্য একই। এটিকে এই সুযোগে পাওয়ার একমাত্র উপায় হ'ল প্যারেন্সের অভ্যন্তরে কোনও পরিবর্তনশীলকে এটি নির্ধারণ করা।

((namedfunc = function namedfunc () { ... })())

বাইরের প্যারেনগুলি অপ্রয়োজনীয়:

(namedfunc = function namedfunc () { ... })()

তবে আপনি বিশ্বব্যাপী ঘোষণাটি চান না, তাই না?

সুতরাং এটি এটিকে ফুটিয়ে তোলে:

(function namedfunc () { ... })()

এবং আপনি এটি আরও কমাতে পারেন: নামটি অপ্রয়োজনীয় কারণ এটি কখনই ব্যবহার করা হবে না (যদি না আপনার ফাংশনটি পুনরাবৃত্তি না করে .. এবং তারপরেও আপনি ব্যবহার করতে পারেন arguments.callee)

(function () { ... })()

এটি সম্পর্কে আমি যেভাবে চিন্তা করি (এটি ভুল হতে পারে, আমি এখনও ইসমাস্ক্রিপ্টের বিশদটি পড়িনি) n't আশা করি এটা সাহায্য করবে.


নোটটি arguments.calleeES5 (এবং কঠোর মোডে নিষিদ্ধ) থেকে অবহেলিত।
nyuszika7h

"বাহ্যিক পেরেনগুলি অপ্রয়োজনীয়:" - আমি মনে করি যে ফাইলগুলি সংক্ষিপ্ত করার সময় তারা ত্রুটিগুলি রোধ করে, অন্যথায় আপনার প্রয়োজন হবে! অথবা অন্যকিছু.
জিমিটি 1988

-3

পার্থক্যটি কেবলমাত্র বিদ্যমান কারণ ডগলাস ক্রকফোর্ড আইআইএফই জন্য প্রথম শৈলী পছন্দ করে না ! (সিরিয়াসলি) আপনি এই ভিডিওতে দেখতে পাবেন !!

অতিরিক্ত মোড়কের অস্তিত্বের একমাত্র কারণ ()both উভয় শৈলীতেই code কোডটি ফাংশন এক্সপ্রেশনের বিভাগটি তৈরি করতে সহায়তা করা , কারণ ফাংশন ডিক্লারেশন অবিলম্বে বলা যেতে পারে না। কিছু স্ক্রিপ্ট / জাস্ট ব্যবহার কম করা সমর্থনকারীদের পক্ষে +, !, -& ~পরিবর্তে খুব বন্ধনীর। এটার মত:

+function() {  
    var foo = 'bar';  
}();

!function() {  
    var foo = 'bar';  
}();

-function() {  
    var foo = 'bar';  
}();

~function() {  
    var foo = 'bar';  
}();

এবং এই সমস্ত আপনার বিকল্প হিসাবে ঠিক একই। এই ক্ষেত্রেগুলির মধ্যে নির্বাচন করা সম্পূর্ণ নিজের নিজের এবং কোনও পার্থক্য নেই। With যেগুলি 1 বাইট বৃহত্তর ফাইল() উত্পাদন করে ;-)}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.