এই জাভাস্ক্রিপ্ট / jQuery সিনট্যাক্সটি কীভাবে কাজ করে: (ফাংশন (উইন্ডো, অপরিজ্ঞাত) {}) (উইন্ডো)?


153

আপনি কি কখনও jQuery 1.4 সোর্স কোডটিতে হুডের নীচে একবার দেখেছেন এবং লক্ষ্য করেছেন যে এটি কীভাবে নিম্নলিখিত উপায়ে আবদ্ধ হয়:

(function( window, undefined ) {

  //All the JQuery code here 
  ...

})(window);

আমি জাভাস্ক্রিপ্ট নেমস্পেসিংয়ের একটি নিবন্ধ এবং অন্যটি " পেরেনসের একটি গুরুত্বপূর্ণ জুড়ি " নামে পড়েছি তাই এখানে কী চলছে সে সম্পর্কে আমি কিছুটা জানতে পারি।

তবে আমি এই নির্দিষ্ট বাক্য গঠন আগে কখনও দেখিনি। কি যে হয় undefinedসেখানে করছেন? এবং কেন windowপাস করার প্রয়োজন হয় এবং তারপরে আবার শেষে উপস্থিত হওয়া দরকার?


3
আমি পল আইরিশ এই ভিডিওতে এই সম্পর্কে কথা বলতে চাই: পৈলিরিশ.com
2010/

@ বেরগি আপনি আমার প্রশ্নটিকে অন্যটির সদৃশ হিসাবে চিহ্নিত করেছেন তবে আমি নকলটির প্রায় এক বছর আগে প্রশ্নটি জিজ্ঞাসা করেছি। Castালাই অন্য উপায়ে হওয়া উচিত।
ডিসকিনজার

@ ডকিনজার: এটি আগে জিজ্ঞাসা করার বিষয়ে নয়, এটি সর্বোচ্চ মানের উত্তর সম্পর্কে। স্বীকারযোগ্য, এক্ষেত্রে এটি ঘাড় এবং ঘাড়, তবে আমি সিএমএসের উত্তরটি সবচেয়ে ভাল হিসাবে পেয়েছি। এটি আলোচনা করতে চ্যাট.স্ট্যাকওভারফ্লো / রুম / 17 এ আসুন , যদিও
বার্গি

উত্তর:


161

অপরিবর্তিত একটি সাধারণ পরিবর্তনশীল এবং এটির সাহায্যে সহজেই পরিবর্তন করা যায় undefined = "new value"; । সুতরাং jQuery একটি স্থানীয় "অপরিবর্তিত" ভেরিয়েবল তৈরি করে যা সত্যই অপরিজ্ঞাত।

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


1
ধন্যবাদ! এটি একটি খুব তথ্যপূর্ণ ভিডিও ছিল। আমি মনে করি "উইন্ডো ভেরিয়েবল স্থানীয় করে দেওয়া হয়েছে" বলার জন্য আপনার প্রতিক্রিয়াটি সম্পাদনা করতে হবে। আমি মনে করি এটি সেরা উত্তর is আমি গণনা করে দেখতে পেলাম যে উইন্ডো অবজেক্টটি কমপক্ষে 17 বার JQuery উত্স কোডে কল করা হয়েছিল। সুতরাং স্থানীয় স্কোপে উইন্ডোটি সরানোর ক্ষেত্রে একটি উল্লেখযোগ্য প্রভাব রয়েছে।
dkinzer

@ ডিনকঞ্জার ওহ হ্যাঁ, আপনি rgt, অবশ্যই এটি স্থানীয় করা হয়েছে। খুশি আমি আপনাকে সাহায্য করতে পারি =)
ভিনসেন্ট

1
এই আপডেট হওয়া পরীক্ষার অনুসারে jsperf.com/short-scope/5 'উইন্ডো' পাস করা আসলে উইন্ডো ধীরে ধীরে ধীরে ধীরে আসে, যখন এটি jQuery এর মাধ্যমে একটি উইন্ডো ধ্রুবক পেতে আসে এবং সাফারির জন্য বিশেষত খারাপ। সুতরাং 'অপরিজ্ঞাত' ব্যবহারের ক্ষেত্রে, আমি পুরোপুরি নিশ্চিত নই যে 'উইন্ডো' সব ক্ষেত্রেই বিশেষভাবে কার্যকর।
hexalys

1
কোডটি মিনিফাইং করার জন্য এটি ইতিবাচক প্রভাব ফেলে। সুতরাং "উইন্ডো" এবং "অপরিজ্ঞাত" এর প্রতিটি ব্যবহারকে মিনিফায়ার দ্বারা একটি ছোট নাম দিয়ে প্রতিস্থাপন করা যেতে পারে।
TLindig

2
@ lukas.pukenis আপনি যখন একটি লাইব্রেরি তৈরি করছেন যা লক্ষ লক্ষ ওয়েবসাইটগুলিতে ব্যবহৃত হয়, তখন পাগলেরা কী করবে সে সম্পর্কে ধারণা না করা বুদ্ধিমানের কাজ।
জেএলআরিশ

54

অনির্দিষ্ট

ঘোষণা করে undefinedএকটি আর্গুমেন্ট হিসাবে কিন্তু কখনও একটি মান ক্ষণস্থায়ী তা নিশ্চিত করে যে এটা সবসময়, undefined হিসাবে এটি সহজভাবে বিশ্বব্যাপী সুযোগ যে ওভাররাইট হতে পারে একটি পরিবর্তনশীল। এটির a === undefinedএকটি নিরাপদ বিকল্প তৈরি করে typeof a == 'undefined', যা কয়েকটি অক্ষর সংরক্ষণ করে। এটি কোডটিকে আরও ক্ষুদ্র-বান্ধব করে তোলে, যেমন undefinedছোট করা যেতে পারে uউদাহরণস্বরূপ, আরও কয়েকটি অক্ষর সংরক্ষণ করা।

জানলা

windowযুক্তি হিসাবে পাস করা স্থানীয় কপিরাইটে একটি অনুলিপি রাখে, যা কার্য সম্পাদনকে প্রভাবিত করে: http://jsppha.com/short-scope । সমস্ত অ্যাক্সেসগুলিকে windowএখন স্কোপ চেইনের উপরে এক স্তর কম ভ্রমণ করতে হবে। হিসাবে undefined, একটি স্থানীয় অনুলিপি আরও আক্রমণাত্মক হ্রাস করার অনুমতি দেয়।


সাইড নোট:

যদিও এটি jQuery বিকাশকারীদের উদ্দেশ্য নাও থাকতে পারে, তবুও পাঠাগারটি windowসার্ভার-সাইড জাভাস্ক্রিপ্ট এনভায়রনমেন্টগুলিতে আরও সহজেই সংহত করতে দেয়, উদাহরণস্বরূপ নোড.জেএস - যেখানে কোনও বিশ্ববস্তু নেই window। এমন পরিস্থিতিতে, windowঅবজেক্টটিকে অন্য একটিতে প্রতিস্থাপন করতে কেবল একটি লাইন পরিবর্তন করতে হবে । জিকুয়েরির ক্ষেত্রেwindow , এইচটিএমএল স্ক্র্যাপিংয়ের উদ্দেশ্যে একটি মক অবজেক্ট তৈরি এবং পাস করা যেতে পারে ( জাসডমের মতো একটি লাইব্রেরি এটি করতে পারে)।


2
Minification উল্লেখ জন্য +1 ইচ্ছুক আমি jsperf জন্য পারা +2 - minified সংস্করণ (function(a,b){})(window);- aএবং bতুলনায় অনেক খাটো windowএবং undefined:)
gnarf

+1 আমি এর আগে স্কোপ চেইনের কথা শুনেছি , তবে শব্দটি ভুলে গিয়েছি । ধন্যবাদ!
অ্যালেক্স

এটি অকার্যকর (0) ব্যবহারের বিকল্প যা একই কারণে বোঝানো হয়েছিল: অকার্যকর (0) অপরিবর্তিত মান পাওয়ার একটি নিরাপদ উপায়।
glmxndr

"আপনি কি বলবেন" এই অন্য প্রশ্নের উল্লেখের মধ্যে রয়েছে: stackoverflow.com/questions/4945265/...
gnarf

@gnarf, প্রশ্নগুলি একত্রিত করার বিজ্ঞপ্তির জন্য ধন্যবাদ। আমি আমার উত্তরটি আরও কিছুটা বোঝার জন্য সম্পাদনা করব;)
ডেভিড টাং

16

অন্যরা ব্যাখ্যা করেছেন undefinedundefinedএটি বিশ্বব্যাপী ভেরিয়েবলের মতো যা কোনও মানকেই আবার সংজ্ঞায়িত করা যায়। এই কৌশলটি হ'ল যে undefined = 10কোনও জায়গায় কোথাও লিখেছেন তবে সমস্ত অপরিজ্ঞাত চেকগুলি ভাঙা থেকে বিরত করা । কোনও যুক্তি যা কখনই পাস হয় না undefinedতা ভেরিয়েবলের মান নির্বিশেষে আসল হতে গ্যারান্টিযুক্ত undefined

উইন্ডো পাস করার কারণটি নীচের উদাহরণ দিয়ে চিত্রিত করা যেতে পারে।

(function() {
   console.log(window);
   ...
   ...
   ...
   var window = 10;
})();

কনসোল লগ করে কি? windowঅবজেক্টের মান ঠিক? ভুল! 10? ভুল! এটি লগ undefined। জাভাস্ক্রিপ্ট ইন্টারপ্রেটার (বা জেআইটি সংকলক) এটিকে আবার লিখেছে -

(function() {
   var window; //and every other var in this function

   console.log(window);
   ...
   ...
   ...
   window = 10;

})();

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

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


6

windowআইই তে কেউ উইন্ডো অবজেক্টটিকে নতুনভাবে সংজ্ঞায়িত করার সিদ্ধান্ত নেয় এমন ক্ষেত্রে পাস করা হয়, আমি undefinedপরে এটির জন্য কিছুটা পুনরায় বরাদ্দ করা ক্ষেত্রে তার জন্যও এটিরূপে ধরে নিই ।

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

JQuery, প্লাগইন .noConflict()হ্যান্ডলিংয়ে ব্যবহৃত সর্বাধিক সাধারণ কেসটি দেখিয়ে এটি ভাবতে সহজ হতে পারে , সুতরাং সংখ্যাগরিষ্ঠ কোডের জন্য আপনি এখনও ব্যবহার করতে পারবেন $, এমনকি যদি এর বাইরে এই ব্যতিরেকে অন্য কিছু বোঝায় তবে jQuery:

(function($) {
  //inside here, $ == jQuery, it was passed as the first argument
})(jQuery);

ধন্যবাদ। এই ধারণা অনেক জ্ঞান এর. যদিও, আমি মনে করি উত্তরটি এটির এবং সি সি জাকাস যা বলেছে তার সংমিশ্রণ।
dkinzer

@ ডিনকঞ্জার আমি ভীতাম আমি সি জাকাস নই;)
ভিনসেন্ট

@ ভিনসেন্ট, এটির জন্য দুঃখিত :-)
ডিকিনজার

5

1000000 পুনরাবৃত্তি সঙ্গে পরীক্ষিত। এই জাতীয়করণের কোনও কার্যকারিতা ছিল না effect 1000000 পুনরাবৃত্তিতে একক মিলিসেকেন্ডও নয়। এটি কেবল অকেজো।


2
উল্লেখ করার মতো নয়, ক্লোজারটি ফাংশনের উদাহরণ সহ সমস্ত পরিবর্তনশীল বহন করে, সুতরাং আপনার যদি বন্ধে 100 বাইট থাকে এবং 1000 মেমরি যা 100 কিলো মেমরি বেশি হয়।
আকাশ কাভা

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

@ গ্যাবেরিয়াল নতুন জাভাস্ক্রিপ্ট ইঞ্জিনগুলি সংকলনের সময়েই ক্লোজারগুলি সমাধান করে, রানটাইম বন্ধ হওয়ার সময় কোনও কার্যকারিতা লাভ নেই। আমি সন্দেহ করি যে কোনও পরিমাপযোগ্য পারফরম্যান্স লাভ রয়েছে, আপনি যদি এতটা আত্মবিশ্বাসী হন তবে আপনি পারফরম্যান্স প্রদর্শনের জন্য jsperf উদাহরণ তৈরি করতে পারেন। কেবলমাত্র পারফরম্যান্স হ'ল ক্লোজারগুলি বিচ্ছিন্ন করে যার ফলশ্রুতিতে আরও ভাল সংশোধন হয় যা আকার এবং কর্মক্ষমতা হ্রাস করে এবং দ্রুত ডাউনলোড এবং স্ক্রিপ্ট পার্সিংয়ের মাধ্যমে অর্জন করা হয়।
আকাশ কাবা

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

একটি কোড রয়েছে যেখানে উইন্ডোটি শেষে সজ্জিত কিন্তু ফাংশনের প্যারামিটারগুলিতে প্রবেশ করা হয়নি, এর অর্থ কী? এটি নিশ্চিত করে যে প্যারামিটারগুলি মূল গ্লোবালের স্কোপ অবজেক্টটিকে অনুসরণ করবে যদিও আমি ধরে নেই যে কোনও উইন্ডো প্যারাম নেই?
ওয়েবউইম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.