জাভাস্ক্রিপ্ট এর লুকানো বৈশিষ্ট্য? [বন্ধ]


312

জাভাস্ক্রিপ্টের কোন "লুকানো বৈশিষ্ট্য" আপনি কি মনে করেন যে প্রতিটি প্রোগ্রামারকে জানা উচিত?

নিম্নলিখিত প্রশ্নের উত্তরের দুর্দান্ত গুণটি দেখার পরে আমি ভেবেছিলাম এটি জাভাস্ক্রিপ্টের জন্য জিজ্ঞাসা করার সময় এসেছে।

যদিও জাভাস্ক্রিপ্ট বর্তমানে যুক্তিযুক্তভাবে ক্লায়েন্ট সাইডের ভাষা (কেবল গুগলকে জিজ্ঞাসা করুন) আশ্চর্যজনক যে বেশিরভাগ ওয়েব বিকাশকারী এটির কতটা শক্তিশালী প্রশংসা করে।


1
আপনি কি বোঝাতে চাইছেন না যে "এই অন্যান্য প্রশ্নের প্রতি দৃষ্টিভঙ্গি এবং দৃষ্টিভঙ্গি দেখেছি, আমি ভেবেছিলাম আমার নিজের উত্থাপনের জন্য প্রায় একই প্রশ্নটি জিজ্ঞাসা করব"? ;-)
ববি জ্যাক 18

1
অবশ্যই, হতাশ। :) আমি এটিকে একটি সম্প্রদায় প্রশ্ন করার বিষয়টি বিবেচনা করব। এছাড়াও, আপনি নির্দিষ্ট সংখ্যক পয়েন্ট পাওয়ার পরে এটি সমস্তই হ্রাস পাচ্ছে।
আল্লায় লালোন্ডে

1
যথেষ্ট সুষ্ঠু - এটি আপনার মনে হয় না এমন 'রেপ' দরকার! আমার ধারণা আমি সি # এক নিয়ে কেবল একটি বড় সমস্যা পেয়েছি - ঠিক ঠিক এই সাইটের প্রশ্নের জন্য আমার মনে হচ্ছে না question
ববি জ্যাক

3
হ্যাঁ, সম্ভবত না, তবে আমি উত্তরগুলিতে দুর্দান্ত জ্ঞান পেয়েছি। আমার মনে হয় আপনার পক্ষে গড়পড়তাভাবে সি # প্রোগ্রামারকে সমস্ত জায়গায় এক জায়গায় প্রকাশের জন্য চাপ দেওয়া হবে যদি তা না করে থাকেন। একই হার্ড উইনড তালিকার সাথে আসতে এটির সাথে খেলতে কয়েক বছর সময় লাগবে।
আল্লায় লালোন্ডে

7
আমি এখন 10 বছর ধরে পেশাদারভাবে জাভাস্ক্রিপ্ট লিখছি এবং আমি এই থ্রেড থেকে একটি বা তিনটি জিনিস শিখেছি। ধন্যবাদ, অ্যালান!
অ্যান্ড্রু হেজেস

উত্তর:


373

কোনও ক্রিয়াকলাপের জন্য আপনাকে কোনও পরামিতি নির্দিষ্ট করতে হবে না। আপনি কেবল ফাংশনের argumentsঅ্যারের মতো অবজেক্টটি ব্যবহার করতে পারেন ।

function sum() {
    var retval = 0;
    for (var i = 0, len = arguments.length; i < len; ++i) {
        retval += arguments[i];
    }
    return retval;
}

sum(1, 2, 3) // returns 6

117
লক্ষণীয় যে যদিও আর্গুমেন্টগুলি অ্যারের মতো কাজ করে তবে এটি কোনও আসল জাভাস্ক্রিপ্ট অ্যারে নয় - এটি কেবল একটি বিষয়। সুতরাং আপনি (), পপ (), পুশ (), স্লাইস () এবং আরও কিছুতে যোগ দিতে পারবেন না। (আপনি যদি এটি চান তবে আপনি এটিকে সত্যিকারের অ্যারেতে রূপান্তর করতে পারেন: "var argArray = Array.prototype.slice.call (যুক্তি);")
জ্যাকব ম্যাটিসন ২

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

48
একই শিরাতে, যুক্তিগুলির একটি "কলি" সম্পত্তি রয়েছে যা বর্তমান কাজ function এটি বেনাম ফাংশনগুলির সাথে পুনরাবৃত্তি করতে দেয়, দুর্দান্ত!
ভিনসেন্ট রবার্ট

4
@ নাথান "এফ (এক্স, ওয়াই, জেড)" "এফ ([এক্স, ওয়াই, জেড])" এর চেয়ে ভাল দেখাচ্ছে।
মার্ক সিডেড

16
@ ভিনসেন্ট রবার্ট: দয়া করে নোট করুন যে হ্রাস arguments.calleeকরা হচ্ছে।
কেন

204

আমি ডগলাস ক্রকফোর্ডের বেশিরভাগ দুর্দান্ত বই জাভাস্ক্রিপ্ট: দ্য গুড পার্টসের উদ্ধৃতি দিতে পারি ।

কিন্তু আমি শুধু আপনার জন্য এক নেব, সবসময় ব্যবহার ===এবং !==পরিবর্তে ==এবং!=

alert('' == '0'); //false
alert(0 == ''); // true
alert(0 =='0'); // true

==অস্থির নয়। আপনি যদি ===এটি ব্যবহার করেন তবে প্রত্যাশা অনুযায়ী এই সমস্ত বিবৃতি মিথ্যা দেবে give


29
এটি লজ্জাজনক যে এত লোক মনে করে ক্রোকফোর্ড সর্বজ্ঞ। ঠিক আছে, লোকটি তার বেশিরভাগ সমালোচনার চিহ্নের সাথেই ঠিক আছে, তবে আমি তার জিনিসকে অনেক দেব-দেবীর মতো কম্বল এন্ডোর্সমেন্ট দেওয়া থেকে বিরত হই ...
জেসন বুটিং

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

30
আপনি ডায়নামিক টাইপিং দ্বারা বিভ্রান্ত হয়ে থাকেন এবং কেবল এটি "সত্যিকারের" সমান হতে চান তবে == এর পরিবর্তে == ব্যবহারটি হ'ল পরামর্শ। আমাদের মধ্যে যারা ডায়নামিক টাইপিং বোঝেন তারা 0 == '' বা 0 == '0' এর মতো আমরা যে পরিস্থিতিতে আমরা কাস্ট করতে চাই তার জন্য == ব্যবহার চালিয়ে যেতে পারে।
থোমাস্রুটার

20
ভাল == এবং === গতিশীল টাইপিং সম্পর্কে নয়। == প্রকারভেদ টাইপ করে, যা একটি ভিন্ন জন্তু। যদি আপনি জানেন, আপনি স্ট্রিং / নম্বর / ইত্যাদিতে কাস্ট করতে চান, তবে আপনি তা স্পষ্টভাবে করতে হবে।
রিনি সরসু

15
আমি মনে করি এর বিভীষিকাময় অংশটি ==হল '\n\t\r ' == 0=> true...: ডি
শ্রীকান্ত শরৎ

189

ফাংশনগুলি জাভাস্ক্রিপ্টে প্রথম শ্রেণির নাগরিক:

var passFunAndApply = function (fn,x,y,z) { return fn(x,y,z); };

var sum = function(x,y,z) {
  return x+y+z;
};

alert( passFunAndApply(sum,3,4,5) ); // 12

কার্যকরী প্রোগ্রামিং কৌশলগুলি মার্জিত জাভাস্ক্রিপ্ট লিখতে ব্যবহার করা যেতে পারে

বিশেষত, ফাংশনগুলি পরামিতি হিসাবে পাস করা যেতে পারে, যেমন অ্যারে.ফিল্টার () একটি কলব্যাক গ্রহণ করে:

[1, 2, -1].filter(function(element, index, array) { return element > 0 });
// -> [1,2]

আপনি একটি "ব্যক্তিগত" ফাংশন ঘোষণা করতে পারেন যা কেবলমাত্র একটি নির্দিষ্ট ফাংশনের সুযোগের মধ্যে বিদ্যমান:

function PrintName() {
    var privateFunction = function() { return "Steve"; };
    return privateFunction();
}

3
জাভাস্ক্রিপ্টে ফাংশনগুলি তৈরি করার জন্য তিনটি উপায় রয়েছে: ফাংশন যোগফল (x, y, z) {রিটার্ন (x + y + z); ; এবং ভার যোগফল = নতুন ফাংশন ("x", "y", "জেড", "রিটার্ন (x + y + z);"); অন্য উপায় হয়।
মারিয়াস

6
ফাংশন-এ-ডেটা ধারণাটি অবশ্যই আমার বইয়ের বড় পয়েন্টগুলিতে জিতবে।
জেসন বুটিং 21

আমি কেবলমাত্র নির্দিষ্ট ফাংশনের সুযোগের মধ্যে থাকা "ব্যক্তিগত" ফাংশনটি কীভাবে ব্যবহার করতে হয় তা দেখানোর জন্য আমি নমুনাটি আপডেট করেছি।
ক্রিস পিটসমান 14

new Function()হিসাবে খারাপ হিসাবে eval। ব্যবহার করবেন না.
নিকোলের

11
নিশ্চিত না যে এটি একটি লুকানো বৈশিষ্ট্য ... আরও মূল বৈশিষ্ট্যের মতো।
ক্লাউডিয়ু

162

আপনি ইন ব্যবহার করতে পারেনকোনও বস্তুর মধ্যে কী রয়েছে কিনা তা পরীক্ষা অপারেটরটি :

var x = 1;
var y = 3;
var list = {0:0, 1:0, 2:0};
x in list; //true
y in list; //false
1 in list; //true
y in {3:0, 4:0, 5:0}; //true

যদি আপনি অবজেক্টের আক্ষরিকাগুলিকে খুব কুৎসিত মনে করেন তবে আপনি এটি প্যারামিটারলেস ফাংশন টিপের সাথে একত্রিত করতে পারেন:

function list()
 { var x = {};
   for(var i=0; i < arguments.length; ++i) x[arguments[i]] = 0;
   return x
 }

 5 in list(1,2,3,4,5) //true

22
এত চালাক নয়, কোনও কী উপস্থিত থাকলে তা পরীক্ষা করে, কোনও মান না থাকলে। তালিকায় এক্স; কেবলমাত্র x [1]! = নালার কারণে কাজ করে, কারণ মান 1 নেই।
আর্মিন রোনাচার

1
আইএনএ করার সময় আমি কৌশলটি ব্যবহার করি নি তাই আমি ভুলে গিয়েছিলাম যে আমি আসলে বস্তুর আক্ষরিক ব্যবহার আগে করেছি। সংশোধনীর জন্য ধন্যবাদ.
মার্ক সিডেপ

34
এছাড়াও, সাবধান: অপারেটর প্রোটোটাইপ চেইনটিও পরীক্ষা করে! যদি কেউ অবজেক্ট.প্রোটোটাইপটিতে '5' নামে সম্পত্তি রেখে থাকে তবে দ্বিতীয় উদাহরণটি আপনি যদি '5 তালিকায় (1, 2, 3, 4)' বলে ডাকেন এমনকি সত্য হয় তবে আপনি আরও ভাল ব্যবহার করতে পারবেন পদ্ধতি: তালিকা (1, 2, 3, 4) .অবসনেপ্রটি (5) মিথ্যা ফিরিয়ে দেবে, এমনকি যদি অবজেক্ট.প্রোটোটাইপের কোনও সম্পত্তি '5' থাকে।
মার্টিজন

3
খুব সাধারণ সমাধানের জন্য, যা পরীক্ষা করতে পারে যে কোনও বস্তুর নিজস্ব সম্পত্তি রয়েছে কিনা তা "hasOwnProperty" নামকরণ করা হলেও, আপনাকে এই পথে যেতে হবে: অবজেক্ট.প্রোটোটাইপ.হেসনপ্রপ্রেটিসিএল (বস্তু, নাম) ;
ক্রিস কোয়াল

1
@ ক্রিস, যদি না কেউ অবজেক্ট.প্রোটোটাইপ.হসন প্রোপার্টি ওভাররাইট করে;)
নিক

153

ভেরিয়েবলগুলিকে ডিফল্ট মান নির্ধারণ করা

আপনি ||একটি ডিফল্ট মান প্রদান করতে একটি অ্যাসাইনমেন্ট এক্সপ্রেশনটিতে লজিকাল বা অপারেটরটি ব্যবহার করতে পারেন :

var a = b || c;

aভেরিয়েবলের মান পাবেন cযদি শুধু bহয় falsy (হলে null, false, undefined, 0, empty string, অথবা NaN), অন্যথায়a মূল্য পাবেনb

এটি প্রায়শই কার্যকারীগুলিতে কার্যকর হয় যখন আপনি কোনও যুক্তিতে ডিফল্ট মান দিতে চান না তবে ক্ষেত্রে:

function example(arg1) {
  arg1 || (arg1 = 'default value');
}

ইভেন্ট হ্যান্ডলারগুলিতে আইই ফলব্যাক উদাহরণ:

function onClick(e) {
    e || (e = window.event);
}

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

দ্য debuggerবিবৃতি

এতে বর্ণিত: .1 12.15 ডিবাগার বিবৃতি

এই বিবৃতিটি আপনাকে ঠিক এর মাধ্যমে আপনার কোডগুলিতে প্রোগ্রামিকভাবে ব্রেকপয়েন্টগুলি রাখতে দেয় :

// ...
debugger;
// ...

যদি কোনও ডিবাগার উপস্থিত বা সক্রিয় থাকে তবে এটি ঠিক সেই লাইনের সাথে সাথেই এটি ভেঙে ফেলবে।

অন্যথায়, যদি ডিবাগার উপস্থিত না থাকে বা সক্রিয় না থাকে তবে এই বিবৃতিটির কোনও পর্যবেক্ষণযোগ্য প্রভাব নেই।

একাধিক স্ট্রিং আক্ষরিক

এতে বর্ণিত: § 7.8.4 স্ট্রিং লিটারালস

var str = "This is a \
really, really \
long line!";

আপনাকে অবশ্যই সাবধানতা অবলম্বন করতে হবে কারণ পাশের অক্ষরটি \ অবশ্যই একটি লাইন টার্মিনেটর হতে হবে , \উদাহরণস্বরূপ যদি আপনার পরে কোনও স্থান থাকে তবে কোডটি ঠিক একই রকম দেখাবে , তবে এটি একটি বাড়িয়ে তুলবে SyntaxError


28
যদি এটি বাতিল হয় না, যদি এটি মিথ্যা বলে বিবেচিত হয়। a = 0 || 42; আপনাকে 42 দিবে। এটি পাইথনের সাথে তুলনাযোগ্য বা সি # এর নয় ?? অপারেটর. আপনি যদি সি # আচরণ চান তবে একটি = (খ === নাল) করুন? গ: খ;
আর্মিন রোনাচর

এটি ভিসুয়াল স্টুডিওতেও কাজ করে, যদি আপনি
এএসপি.এনইটি

2
আমি ইচ্ছা করি সেখানে যথাযথ || শুধুমাত্র অপরিজ্ঞাত জন্য। আমি আজকে 0-র জন্য কামড়েছি, যেহেতু আমি ওভারলোডেড পদ্ধতির অনুকরণ তৈরি করতে চেয়েছিলাম, যাতে শেষ যুক্তিটি alচ্ছিক ছিল এবং পরিবর্তে একটি ডিফল্ট মান ব্যবহৃত হবে।
উদাগা

এই কৌশলটি ডিফল্ট গুগল অ্যানালিটিক্স স্নিপেট ব্যবহার করে। `বর্ণ _গাক = _গাক || []; `; এটি অতিমাত্রায় ব্যবহারকারীদের নিজস্ব কাজ ওভাররাইট করা থেকে বাধা দেয়।
ইয়াহেল

2
আমি মাল্টলাইন স্ট্রিং আক্ষরিক কৌশল সম্পর্কে জানতাম না। ধন্যবাদ, দুর্দান্ত
চার্লি ফুল 2

145

জাভাস্ক্রিপ্টের ব্লক স্কোপ নেই (তবে এটি বন্ধ হয়ে গেছে তাই আসুন এটি এমনকি কল করুন?)।

var x = 1;
{
   var x = 2;
}
alert(x); // outputs 2

3
এটি একটি ভাল। ভাষার মতো বেশিরভাগ সি থেকে এটি একটি গুরুত্বপূর্ণ পার্থক্য।
মার্টিন ক্লার্ক

9
আপনি সর্বদা "var tmp = ফাংশন () {/ * ব্লক স্কোপ * /} ();" করতে পারেন। বাক্য গঠনটি কুৎসিত, তবে এটি কার্যকর হয়।
জোয়েরি সেব্রেচটস

3
অথবা আপনি যদি কেবলমাত্র ফায়ারফক্সের জন্য "লেট" ব্যবহার করতে পারেন: stackoverflow.com/questions/61088/…
ইউজিন ইয়োকোটা

10
বা কেবল: (ফাংশন () {var x = 2;}) (); সতর্কতা (টাইফফ এক্স); // অপরিবর্তিত
পিম জ্যাজার

@ পিম: জেএসলিন্ট বলেছেন: "ফাংশন থাকা প্যারেন্সগুলিতে আমন্ত্রণটি সরান" " "'ফাংশন' এবং '('।" এর মধ্যে ঠিক একটি জায়গার প্রত্যাশার সাথে
হ্যালো 71

144

[]পরিবর্তে আপনি অবজেক্ট বৈশিষ্ট্য অ্যাক্সেস করতে পারেন.

এটি আপনাকে ভেরিয়েবলের সাথে মিলে যাওয়া কোনও সম্পত্তি সন্ধান করতে দেয়।

obj = {a:"test"};
var propname = "a";
var b = obj[propname];  // "test"

যার নাম আইনী শনাক্তকারী নয় এমন অবজেক্ট বৈশিষ্ট্য পেতে / সেট করতে আপনি এটি ব্যবহার করতে পারেন।

obj["class"] = "test";  // class is a reserved word; obj.class would be illegal.
obj["two words"] = "test2"; // using dot operator not possible with the space.

কিছু লোক এটি জানে না এবং এগুলি () হিসাবে এগুলি () ব্যবহার করে শেষ করে যা সত্যিই খারাপ ধারণা :

var propname = "a";
var a = eval("obj." + propname);

এটি পড়া শক্ত, ত্রুটিগুলি খুঁজে পাওয়া শক্ত (jslint ব্যবহার করতে পারে না) কার্যকর করা ধীর এবং এক্সএসএস শোষণের দিকে নিয়ে যেতে পারে।


eval মন্দ, যদিও খুব কমই প্রয়োজন
ডগ ডোমেনি

আমি কখনই ইভাল ব্যবহার করি না এবং মনে করি কখন এটি আবিষ্কার করেছি। এটি আমাকে খুব খুশি করেছে।

সারসংক্ষেপে, বিন্দু এবং সাবস্ক্রিপ্ট স্বরলিপি উভয়ের মাধ্যমে অবজেক্টের বৈশিষ্ট্যগুলি অ্যাক্সেস করা যায়
রাশ ক্যাম

9
এটি আকর্ষণীয়ভাবে লক্ষ্য করা যায় যে ডট-রেফারেন্সিংটি আসলে বন্ধনীর জন্য সিনট্যাক্স চিনির হয়। foo.barযাইহোক, নকশা অনুযায়ী, ঠিক যেমন আচরণ করে foo["bar"]। এছাড়াও মনে রাখবেন যে সবকিছুই একটি স্ট্রিং সম্পত্তি। এমনকি আপনি অ্যারে অ্যাক্সেস করার পরেও array[4], 4 টি স্ট্রিংয়ে রূপান্তরিত হয় (আবার, কমপক্ষে ECMAScript v3 স্পেস অনুসারে)
ক্লদিউ

আমার ধারণা প্রতিটি জেএস প্রোগ্রামারের এটি জানা উচিত know
কেম কল্যাঙ্কু

144

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

গুগল: জাভাস্ক্রিপ্ট অ্যারে বাছাই এমডিসি
(বেশিরভাগ ক্ষেত্রে আপনি "জাভাস্ক্রিপ্ট" বাদ দিতে পারেন)

আপডেট: মোজিলা বিকাশকারী কেন্দ্রের নাম পরিবর্তন করে মোজিলা বিকাশকারী নেটওয়ার্ক করা হয়েছে । "এমডিসি" কীওয়ার্ড ট্রিকটি এখনও কাজ করে তবে খুব শীঘ্রই আমাদের পরিবর্তে "এমডিএন" ব্যবহার শুরু করতে হতে পারে ।


50
বাহ, দুর্দান্ত রিসোর্স। ক্রেপি ডাব্লু 3 স্কুলগুলির চেয়ে তাত্ক্ষণিকভাবে ভাল ...
অসন্তুষ্টগোট

11
আপনার এটি গুগল করার দরকার নেই, আপনি যদি ফায়ারফক্সে রয়েছেন: ঠিক ঠিকানা বারে "অ্যারে এমডিসি" টাইপ করুন এবং এন্টার টিপুন।
শাশা চেদিগোভ

2
সর্বোত্তম অংশটি হ'ল ফলাফলের প্রথম পৃষ্ঠায় এই স্ট্যাক ওভারফ্লো প্রশ্নটি কীভাবে হয় :)
জিয়াআরো

5
এটির একটি প্রস্তাব: এমএমসি ফলাফলগুলি গুগল অনুসন্ধানের ফলাফলগুলিতে আরও চালিত করার জন্য প্রমোশন ডটকম , তৃণমূলের এসইও উদ্যোগ।
ইয়াহেল

3
এখন এমডিএন ডক সেন্টার, সুতরাং 'এমডিসি' কীওয়ার্ডটি এখনও কার্যকর আছে :)
আলেয়াদাম

143

কারও কারও কাছে সামান্য স্পষ্ট হতে পারে ...

ফায়ারব্যাগ ইনস্টল করুন এবং কনসোল.লগ ("হ্যালো") ব্যবহার করুন। এলোমেলো সতর্কতা (); এর ব্যবহারের চেয়ে অনেক বেশি যা আমি মনে করি কয়েক বছর আগে অনেক কিছু করছিলাম।


12
আপনার কোড অন্যদের কাছে প্রকাশের আগে কনসোলের বিবৃতিগুলি সরাতে ভুলবেন না যাদের ফায়ারব্যাগ ইনস্টল নেই।
ক্রিস নো

161
ফাংশন লগ (msg) {যদি (কনসোল) কনসোল.লগ (msg) অন্য সতর্কতা (msg)}
জোশ

4
আরও ভাল, ';;;' দিয়ে লগ স্টেটমেন্টের আগে এবং তারপরে মিনিফাই আপনার জন্য এটি যত্ন করে care (অন্ততপক্ষে, আমি যে পার্ল মডিউলটি ব্যবহার করি সেটিতে এটি বৈশিষ্ট্য রয়েছে এবং এটি সাধারণ ঘটনা দাবি করে))
কেভ

10
জোশ: কনসোল সংজ্ঞায়িত না হওয়ায় এটি কাজ করবে না। আপনি টাইপফোন কনসোলটি পরীক্ষা করতে পারেন!
এলি গ্রে

23
সর্বদা অন্তর্ভুক্ত করুন: যদি (টাইপফ ('কনসোল') == 'অপরিজ্ঞাত') {কনসোল = {লগ: ফাংশন () {}}; } তারপরে আপনি কনসোল.লগ ব্যবহার চালিয়ে যেতে পারেন এবং এটি কিছুই করে না।
গ্রেগম্যাক

120

ব্যক্তিগত পদ্ধতি

একটি অবজেক্টের ব্যক্তিগত পদ্ধতি থাকতে পারে।

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;

    // A private method only visible from within this constructor
    function calcFullName() {
       return firstName + " " + lastName;    
    }

    // A public method available to everyone
    this.sayHello = function () {
        alert(calcFullName());
    }
}

//Usage:
var person1 = new Person("Bob", "Loblaw");
person1.sayHello();

// This fails since the method is not visible from this scope
alert(person1.calcFullName());

16
এটি প্রকৃতপক্ষে কোনও ব্যক্তিগত ফাংশন নয় - এটি স্থানীয় সুযোগে আরও বেশি একটি ফাংশন ভেরিয়েবল।
কিথ

6
সত্য তবে সমস্ত অপারেশনাল সংজ্ঞা দ্বারা আমি এটি একটি পদ্ধতি ভাবতে পারি। এটি একটি নামের কোডের একটি ব্লক যা দৃষ্টান্তের রাজ্যে অ্যাক্সেস পেয়েছে এবং কেবলমাত্র সেই উদাহরণটি দ্বারা দেখা যেতে পারে। একটি বেসরকারী পদ্ধতির আপনার সংজ্ঞা কি?
আল্লায় লালোন্ডে

14
@ জ্যাচ, হুবহু! শ্রেণিভিত্তিক ওও ভাষাগুলির সাথে বছরের পর বছর কাজ করার পরে এটি ভুলে যাওয়া সহজ যে তারা কেবল ওও ধারণাগুলির বাস্তবায়ন। অবশ্যই, বিভিন্ন লাইব্রেরি যেটি
জেএসে অর্ধ

5
কেবল ভাবছি, ব্যক্তি 1 এর কোনও আইন ব্লগ আছে? ;-)
ট্র্যাভিস

4
গ্রেপ্তারকৃত বিকাশের উল্লেখের জন্য +1
ডোমেনিক

99

ক্রকফোর্ডের "জাভাস্ক্রিপ্ট: দ্য গুড পার্টস" এও উল্লেখ করা হয়েছে:

parseInt()বিপদজনক. যদি আপনি এটির সঠিক বেসটি না জানিয়ে স্ট্রিংটি পাস করেন তবে এটি অপ্রত্যাশিত সংখ্যা ফিরে আসতে পারে। উদাহরণস্বরূপ parseInt('010')8 টি প্রত্যাবর্তন করে, 10 নয়। পার্সেন্ট এ একটি বেস পাস করা এটি সঠিকভাবে কাজ করে:

parseInt('010') // returns 8! (in FF3)
parseInt('010', 10); // returns 10 because we've informed it which base to work with.

13
কোড পর্যালোচনাগুলি করার সময়, সর্বদা এটির জন্য সন্ধান করুন। ", 10" ছেড়ে যাওয়া একটি সাধারণ ভুল যা বেশিরভাগ পরীক্ষায় নজরে আসে না।
ডগ ডোমেনি

আমি কয়েক বছর আগে র‌্যাডিক্স ইস্যুতে জ্বলে উঠেছি এবং এর মতো পাল্টা-স্বজ্ঞাত কোনও কিছুই ভুলিনি। একটি দুর্দান্ত বিষয় উল্লেখ করা যেহেতু এটি আপনাকে কিছুক্ষণের জন্য অবাক করে তুলবে।
জেমস এগার্স

4
কেন Math.floorবা ব্যবহার করবেন না Number? 10 === Math.floor("010"); 10 === Number("010");ভাসমান:42 === Math.floor("42.69"); 42.69 === Number("42.69");
মাত্র

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

6
@ ইনফিনিটি: 'কোডিং ত্রুটি' হাইলাইট করতে fn এর নতুন সংজ্ঞা দেওয়ার কী আছে? __parseInt = parseInt; parseInt = function (str, base) { if (!base) throw new Error(69, "All your base belong to us"); return __parseInt(str, base); }
জেবিআরউইলকিনসন

97

ফাংশনগুলি বস্তু এবং তাই বৈশিষ্ট্য থাকতে পারে।

fn = ফাংশন (এক্স) {
   // ...
}

fn.foo = 1;

fn.next = ফাংশন (y) {
  //
}

13
এটি একটি খুব দরকারী পরামর্শ। উদাহরণস্বরূপ, আপনি ফাংশনের সম্পত্তি হিসাবে ডিফল্ট মান সেট করতে পারেন। উদাহরণস্বরূপ: myfunc.delay = 100; তারপরে ব্যবহারকারীগণ ডিফল্ট মান পরিবর্তন করতে পারবেন এবং সমস্ত ফাংশন কলগুলি নতুন ডিফল্ট মান ব্যবহার করবে। উদাহরণস্বরূপ: myfunc.delay = 200; myfunc ();
বেয়ারলিফিটস

দরকারী ... এবং বিপজ্জনক!
পালসুইম

Opালু দেখায়, ভেরিয়েবলের পরিবর্তে কেন এটি ব্যবহার করবেন?
ইনস্ট্যান্টসেটসুন

1
@ ইনস্ট্যান্টসেটসুনা: কেন অন্য পৃথক পরিবর্তনশীল? যথারীতি এটি "যথাযথ / কার্যকর যখন এটি ব্যবহার করুন" ;-)
ভাসবে এবং ভলকারক

91

আমাকে স্ব-সম্পাদনকারী কার্যগুলি বলতে হবে।

(function() { alert("hi there");})();

জাভাস্ক্রিপ্টের ব্লক সুযোগ নেই বলে আপনি যদি স্থানীয় ভেরিয়েবলগুলি সংজ্ঞায়িত করতে চান তবে আপনি একটি স্ব-সম্পাদনকারী ফাংশন ব্যবহার করতে পারেন:

(function() {
  var myvar = 2;
  alert(myvar);
})();

এখানে, myvarহস্তক্ষেপ বা বৈশ্বিক সুযোগকে দূষিত করে না এবং ফাংশন শেষ হয়ে গেলে অদৃশ্য হয়ে যায়।


2
এটি কি জন্য দরকারী? সতর্কতাটি ফাংশনের বাইরে রেখে আপনি একই ফলাফল পান।
আলু

7
এটি সতর্কতা সম্পর্কিত নয়, এটি একবারে কোনও ফাংশন সংজ্ঞায়িত এবং সম্পাদন করার বিষয়ে। আপনি যে স্ব-সম্পাদনকারী ফাংশনটি একটি মান ফিরিয়ে দিতে এবং ফাংশনটিকে পরম হিসাবে অন্য ফাংশনে পাস করতে পারেন।
স্কটকুন

5
@ পল এটি এনক্যাপসুলেশন জন্য ভাল।
মাইক রবিনসন

22
এটি ব্লক স্কোপিংয়ের জন্যও ভাল।
জিম হুনজিকার

24
হ্যাঁ, আমি আমার সমস্ত .jsফাইল একটি বেনামে স্ব-সম্পাদনকারী ফাংশনে আবদ্ধ করি এবং এর মধ্যে বিশ্বব্যাপী অ্যাক্সেসযোগ্য যা কিছু চাইব তা windowবস্তুর সাথে সংযুক্ত করি । বিশ্বব্যাপী নেমস্পেস দূষণ রোধ করে।
সিডিএমকেই

83

কোনও ফাংশন দ্বারা কতগুলি পরামিতি প্রত্যাশিত তা জেনে নিন

function add_nums(num1, num2, num3 ){
    return num1 + num2 + num3;
}
add_nums.length // 3 is the number of parameters expected.

ফাংশনটি দ্বারা কতগুলি পরামিতি প্রাপ্ত তা জেনে নিন

function add_many_nums(){
    return arguments.length;
}    
add_many_nums(2,1,122,12,21,89); //returns 6

23
প্রথম অংশ সম্পর্কে কখনই জানতাম না। নিস!
mcjabberz

1
একইভাবে আপনি জানতে পারবেন যে কোনও ফাংশন কতগুলি আর্গুমেন্টের সাথে প্রত্যাশা করছে function.length
জাভি

6
@ জাভি যা উত্তরের 1 ম অংশ
pramodc84

79

এখানে কিছু আকর্ষণীয় জিনিস দেওয়া হল:

  • তুলনা NaNকিছু (এমনকি সঙ্গে NaN) অন্তর্ভুক্ত যে সবসময় মিথ্যা, ==, <এবং >
  • NaN নং নম্বরের জন্য দাঁড়িয়েছে তবে আপনি যদি প্রকারের জন্য জিজ্ঞাসা করেন তবে এটি আসলে একটি নম্বর দেয়।
  • Array.sort একটি তুলনামূলক ফাংশন নিতে পারে এবং কুইকোর্ট-এর মতো চালক দ্বারা ডাকা হয় (প্রয়োগের উপর নির্ভর করে)।
  • নিয়মিত অভিব্যক্তি "ধ্রুবকগুলি" রাষ্ট্রটি বজায় রাখতে পারে, যেমন তারা শেষের জিনিসটির সাথে মেলে।
  • জাভাস্ক্রিপ্ট কিছু সংস্করণ অ্যাক্সেস করতে আপনাকে অনুমতি দেয় $0, $1,$2 একটি Regex উপর সদস্যরা।
  • nullঅন্য কিছুর মত নয়। এটি কোনও বস্তু, বুলিয়ান, সংখ্যা, একটি স্ট্রিং বা নয় undefined। এটি কিছুটা "বিকল্প" এর মতো undefined। (দ্রষ্টব্য typeof null == "object":)
  • বহিরাগত প্রসঙ্গে, thisঅন্যথায় নামবিহীন [গ্লোবাল] অবজেক্ট দেয়।
  • ভেরিয়েবলটির varস্বয়ংক্রিয় ঘোষণার উপর নির্ভর করার পরিবর্তে এর সাথে একটি ভেরিয়েবল ঘোষণা করা রানটাইমটিকে সেই ভেরিয়েবলের অ্যাক্সেস অনুকূলকরণের আসল সুযোগ দেয়
  • withকনস্ট্রাক্ট যেমন optimzations ধ্বংস করবে
  • চলক নামগুলিতে ইউনিকোড অক্ষর থাকতে পারে।
  • জাভাস্ক্রিপ্ট নিয়মিত এক্সপ্রেশন আসলে নিয়মিত হয় না। এগুলি পার্লের রেইগেক্সগুলির উপর ভিত্তি করে রয়েছে এবং লুকেহেডগুলির সাথে এমন অভিব্যক্তি তৈরি করা সম্ভব যা মূল্যায়ণ করতে খুব, খুব দীর্ঘ সময় নেয়।
  • ব্লকগুলির লক্ষ্য হিসাবে লেবেলযুক্ত এবং ব্যবহার করা যেতে পারে break। লুপগুলি লক্ষ্য হিসাবে লেবেলযুক্ত এবং ব্যবহার করা যেতে পারে continue
  • অ্যারেগুলি বিরল নয়। অন্যথায় খালি অ্যারের 1000 তম উপাদানটি সেট করা এটি পূরণ করা উচিত undefined। (বাস্তবায়নের উপর নির্ভর করে)
  • if (new Boolean(false)) {...}{...}ব্লক কার্যকর করা হবে
  • জাভাস্ক্রিপ্টের নিয়মিত এক্সপ্রেশন ইঞ্জিনগুলি বাস্তবায়ন নির্দিষ্ট: যেমন "নন-পোর্টেবল" নিয়মিত এক্সপ্রেশন লিখতে সম্ভব write

[ভাল মন্তব্যের জবাবে কিছুটা আপডেট হয়েছে; মন্তব্য দেখুন]


5
নাল আসলে একটি (বিশেষ) অবজেক্ট। typeof null"অবজেক্ট" প্রদান করে।
এটস গোলাল

4
আপনি [গ্লোবাল] অবজেক্টটি এখান থেকে যে কোনও জায়গা থেকেও পেতে পারেন: var glb = ফাংশন () {এটিকে ফেরত দিন; } ();
জিল্ক 21

2
ব্রাউজারে জাভাস্ক্রিপ্টে গ্লোবাল অবজেক্টটি উইন্ডো অবজেক্ট। যখন বিশ্বব্যাপী স্কোপ করছেন: উইন্ডো.এ == এ;
পিম জাগার

8
"অ্যারেগুলি বিচ্ছিন্ন নয়" বাস্তবায়নের উপর নির্ভর করে। যদি আপনি একটি [1000] এর মান নির্ধারণ করেন এবং একটি [999] দেখুন, তবে হ্যাঁ, এটি হ'ল undefined, তবে এটি এমন কোনও ডিফল্ট মান যা কোনও সূচকের সন্ধান করার সময় পাওয়া যায় না যা অস্তিত্বহীন। আপনি যদি একটি [2000] পরীক্ষা undefinedকরে থাকেন তবে সেটিও হয়ে যাবে তবে এর অর্থ এই নয় যে আপনি এখনও এর জন্য মেমরি বরাদ্দ করেছেন। আইই 8-তে, জেএসক্রিপ্ট ইঞ্জিনটি কীভাবে অনুভূত হয়েছিল তার উপর নির্ভর করে কিছু অ্যারেগুলি ঘন এবং কিছু কিছু অপ্রয়োজনীয়। এখানে আরও পড়ুন: ব্লগস.এমএসডিএন
ক্রিস নিলসন

2
@ এটস এবং @ এসএফ: টাইপফ বিভিন্ন ধরণের ব্যাপ্তির জন্য "অবজেক্ট" প্রদান করে। তবে একবার আপনি কীভাবে এটি কাজ করেন এবং কী কী ধরণের "অবজেক্ট" হিসাবে চিহ্নিত হয় তা কমপক্ষে নির্ভরযোগ্য এবং এর বাস্তবায়নে সামঞ্জস্যপূর্ণ।
থোমাস্রুটার

77

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

// Quick hex to dec conversion:
+"0xFF";              // -> 255

// Get a timestamp for now, the equivalent of `new Date().getTime()`:
+new Date();

// Safer parsing than parseFloat()/parseInt()
parseInt("1,000");    // -> 1, not 1000
+"1,000";             // -> NaN, much better for testing user input
parseInt("010");      // -> 8, because of the octal literal prefix
+"010";               // -> 10, `Number()` doesn't parse octal literals 

// A use case for this would be rare, but still useful in cases
// for shortening something like if (someVar === null) someVar = 0;
+null;                // -> 0;

// Boolean to integer
+true;                // -> 1;
+false;               // -> 0;

// Other useful tidbits:
+"1e10";              // -> 10000000000
+"1e-4";              // -> 0.0001
+"-12";               // -> -12

অবশ্যই, আপনি Number()পরিবর্তে ব্যবহার করে এই সব করতে পারেন , তবে +অপারেটরটি এত সুন্দর!

প্রোটোটাইপগুলি ওভাররাইড করে আপনি কোনও অবজেক্টের জন্য একটি সংখ্যার রিটার্ন মানটিও সংজ্ঞায়িত করতে পারেন valueOf() পদ্ধতিটি । Object বস্তুটিতে সম্পাদিত যে কোনও সংখ্যার রূপান্তরটির ফলাফল হবে না NaN, তবে valueOf()পদ্ধতির রিটার্ন মান :

var rnd = {
    "valueOf": function () { return Math.floor(Math.random()*1000); }
};
+rnd;               // -> 442;
+rnd;               // -> 727;
+rnd;               // -> 718;

আপনি সহজভাবে 0xFFইত্যাদি করতে পারেন , প্রয়োজন নেই +"0xFF"
nyuszika7h

9
@ নিউজিকা 7 এইচ: আপনি এমন বিন্দুটি হারিয়েছেন যা অন্যান্য আদিম এবং বস্তুকে সংখ্যায় চাপ দিচ্ছে । অবশ্যই আপনি ঠিক লিখতে পারেন 0xFF, অনেক একইভাবে আপনি 1পরিবর্তে লিখতে পারেন +true। আমি আপনাকে পরামর্শ দিচ্ছি যদি আপনি চান তবে এর +("0x"+somevar)বিকল্প হিসাবে ব্যবহার করতে পারেন parseInt(somevar, 16)
অ্যান্ডি ই

75

" জাভাস্ক্রিপ্ট মধ্যে এক্সটেনশন পদ্ধতি " প্রোটোটাইপ সম্পত্তি মাধ্যমে।

Array.prototype.contains = function(value) {  
    for (var i = 0; i < this.length; i++) {  
        if (this[i] == value) return true;  
    }  
    return false;  
}

এটি containsসমস্ত Arrayঅবজেক্টে একটি পদ্ধতি যুক্ত করবে । আপনি এই সিনট্যাক্সটি ব্যবহার করে এই পদ্ধতিটি কল করতে পারেন

var stringArray = ["foo", "bar", "foobar"];
stringArray.contains("foobar");

18
এটি সাধারণত একটি খারাপ ধারণা হিসাবে বিবেচিত হয়, কারণ অন্যান্য কোড (আপনার নয়) অ্যারে অবজেক্ট সম্পর্কে ধারণা তৈরি করতে পারে।
ক্রিস নো

39
এটি অ্যারে অবজেক্ট সম্পর্কে অনুমান করা সাধারণত একটি খারাপ ধারণা হিসাবে বিবেচিত হয়। :(
চোখের পলকহীনতা

উম্মম্মম্ম .. জাভাস্ক্রিপ্ট ১.6 অ্যারের অতিরিক্ত? সূচিপত্র? কোন ঘন্টা বাজছে?
ব্রেটন

2
@ ব্রাটন: এটি অ্যারে শ্রেণীর জন্য নির্দিষ্ট কিছু নয়, এটি কেবল উদাহরণ। আমি এটি নতুন তারিখ ()। টু স্ট্রিং () প্রসারিত করতে ব্যবহার করি; পদ্ধতি, একটি মাস্ক স্ট্রিং ব্যবহার করার অনুমতি দেয়। যে কোনও বস্তু বাড়ানো যেতে পারে এবং এর সমস্ত উদাহরণ হ'ল নতুন পদ্ধতি get
এস্তেবান কাবার

1
@ ম্যাথিয়াস: এটি ডোম সম্পর্কে নয়।
ডলম্যান

60

কোনও বস্তু থেকে কোনও সম্পত্তি যথাযথভাবে সরানোর জন্য, আপনার সম্পত্তিটি কেবল এটি অপরিজ্ঞায়িত করার পরিবর্তে মুছতে হবে :

var obj = { prop1: 42, prop2: 43 };

obj.prop2 = undefined;

for (var key in obj) {
    ...

সম্পত্তি প্রোপ 2 এখনও পুনরাবৃত্তির অংশ হবে। আপনি চাইলে প্রোপ 2 থেকে সম্পূর্ণ মুক্তি পেতে পারেন পরিবর্তে এটি করা উচিত:

delete obj.prop2;

আপনি বৈশিষ্ট্যগুলির মাধ্যমে পুনরাবৃত্তি করার সময় সম্পত্তি প্রোপ 2 আর উপস্থিতি তৈরি করবে না।


3
নোট করুন যে মোছার বিবৃতিটি তার ব্রাউজার-নির্দিষ্ট quirks ছাড়া নয়। উদাহরণস্বরূপ, আপনি যদি এটিতে চেষ্টা করে থাকেন তবে এটি একটি বৃহত ত্রুটির সাথে ব্যর্থ হবে এবং অবজেক্টটি কোনও দেশীয় জেএস অবজেক্ট নয় (এমন কোনও সম্পত্তি মুছে ফেলার সময়ও যা আপনি নিজেকে যুক্ত করেছেন)। এটি কোনও ভেরিয়েবল মোছার উদ্দেশ্যে নয়, যেমন মাইভারকে মুছুন; তবে আমি মনে করি এটি কিছু ব্রাউজারে কাজ করে। উপরের উত্তরের কোডটি যদিও বেশ নিরাপদ বলে মনে হচ্ছে।
থোমাসর্টার

উপায় দ্বারা, অপরিজ্ঞাত একটি পরিবর্তনশীলও হতে পারে! Var অপরিবর্তিত = "কিছু" চেষ্টা করুন
জোহান ফিলিপ স্ট্রাথাউসেন

57

with

এটি খুব কমই ব্যবহৃত হয়, এবং খোলামেলাভাবে, খুব কমই দরকারী ... তবে, সীমিত পরিস্থিতিতে এর ব্যবহার রয়েছে।

উদাহরণস্বরূপ: একটি নতুন অবজেক্টে দ্রুত বৈশিষ্ট্য সেট করার জন্য অবজেক্ট লিটারালগুলি বেশ কার্যকর । তবে আপনি যদি কোনও বিদ্যমান অবজেক্টের অর্ধেক বৈশিষ্ট্য পরিবর্তন করতে চান ?

var user = 
{
   fname: 'Rocket', 
   mname: 'Aloysus',
   lname: 'Squirrel', 
   city: 'Fresno', 
   state: 'California'
};

// ...

with (user)
{
   mname = 'J';
   city = 'Frostbite Falls';
   state = 'Minnesota';
}

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

var user = 
{
   fname: "John",
// mname definition skipped - no middle name
   lname: "Doe"
};

with (user)
{
   mname = "Q"; // creates / modifies global variable "mname"
}

সুতরাং, এই withজাতীয় কার্যভারের জন্য বিবৃতিটির ব্যবহার এড়ানো সম্ভবত একটি ভাল ধারণা ।

আরও দেখুন: জাভাস্ক্রিপ্টের "উইথ" স্টেটমেন্টের বৈধ ব্যবহার রয়েছে কি?


29
প্রচলিত প্রজ্ঞার সাথে পরিসংখ্যান সহ এড়ানো যায়। যদি আপনি উল্লিখিত বৈশিষ্ট্যগুলির মধ্যে ব্যবহারকারীর অবজেক্টের একটি না থাকে তবে ব্লকের সিউডো স্কোপ সহ এর বাইরে ভেরিয়েবলটি সংশোধন করা হবে। এই উপায় বাগ মিথ্যা। Yuiblog.com/blog/2006/04/11/with-statement-considered-harmful-
অ্যালান ঝড়

1
শোগ, আপত্তিগুলি ভুল বানানযুক্ত ভেরিয়েবল সম্পর্কে নয়, তারা কোডের ব্লকটি খুঁজছেন এবং সেই ব্লকের কোনও নির্দিষ্ট লাইন কী করে তা নিশ্চিত করে বলতে সক্ষম হচ্ছেন। যেহেতু জাভাস্ক্রিপ্ট অবজেক্টগুলি এত গতিশীল, আপনি কোনও মুহুর্তে কী কী সম্পত্তি / সদস্য রয়েছে তা আপনি অবশ্যই বলতে পারবেন না।
অ্যালান ঝড়

2
আমেন - আমি যদি পাওয়া কোন জেএসের "উইথ" বিবৃতিটি দেখে থাকি, তবে আমি এটি মুছে ফেলতাম এবং এটি যে বিকাশকারী এটি লিখেছিল তা নিশ্চিত করে জিজ্ঞাসা করবো যে এটি জানার জন্য এটি কেন ভাল জিনিস নয় ... "লুকানো বৈশিষ্ট্য?" আরও পছন্দ "ঘৃণ্য বৈশিষ্ট্য।"
জেসন বুটিং 21

1
আরও জটিল চেইন অ্যাবসিডি বিবেচনা করুন "সহ" (এবিসি) {d.foo = বার; powerful শক্তিশালী এবং অন্তর্নিহিত ত্রুটি প্রবণ নয়। মূলটি হ'ল মূলকে এক স্তর উপরে কমানো। এবং একটি পরিবর্তনশীল নাম ভুল বানান? আপনি একটি বাগ প্রবর্তন করছেন আপনাকে যা করতে যদি সেই যেখানেই থাকুন না কেন আপনি এটা করবেন নির্বিশেষে "সঙ্গে" এর।
annakata

4
ডগলাস ক্রকফোর্ড সম্প্রতি একটি "নেট" রকসে জাভাস্ক্রিপ্টের সবচেয়ে খারাপ অংশগুলির মধ্যে একটি "উইথ" বলেছিলেন! পডকাস্ট।
কোর

51

পদ্ধতিতে (বা ফাংশনগুলি) সেই বস্তুতে কল করা যেতে পারে যা সেগুলির সাথে কাজ করার জন্য ডিজাইন করা হয়েছিল সে ধরণের নয়। এটি কাস্টম অবজেক্টগুলিতে নেটিভ (দ্রুত) পদ্ধতিগুলিতে কল করা দুর্দান্ত।

var listNodes = document.getElementsByTagName('a');
listNodes.sort(function(a, b){ ... });

এই কোডটি ক্র্যাশ করেছে কারণ listNodesএটি একটি নয়Array

Array.prototype.sort.apply(listNodes, [function(a, b){ ... }]);

এই কোডটি কাজ করে কারণ ব্যবহার করতে listNodesপর্যাপ্ত অ্যারে-জাতীয় বৈশিষ্ট্য (দৈর্ঘ্য, [] অপারেটর) সংজ্ঞায়িত করে sort()


43

প্রোটোটাইপাল উত্তরাধিকার (ডগলাস ক্রকফোর্ড দ্বারা জনপ্রিয়) জাভাস্ক্রিপ্টে ভারী জিনিসগুলির বিষয়ে আপনার চিন্তাভাবনা সম্পূর্ণরূপে বিপ্লব ঘটায়।

Object.beget = (function(Function){
    return function(Object){
        Function.prototype = Object;
        return new Function;
    }
})(function(){});

এটা হত্যাকারী! করুণা কিভাবে প্রায় কেউ এটি ব্যবহার করে না।

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

var A = {
  foo : 'greetings'
};  
var B = Object.beget(A);

alert(B.foo);     // 'greetings'

// changes and additionns to A are reflected in B
A.foo = 'hello';
alert(B.foo);     // 'hello'

A.bar = 'world';
alert(B.bar);     // 'world'


// ...but not the other way around
B.foo = 'wazzap';
alert(A.foo);     // 'hello'

B.bar = 'universe';
alert(A.bar);     // 'world'

42

কেউ কেউ এটিকে স্বাদের বিষয় বলবেন তবে:

aWizz = wizz || "default";
// same as: if (wizz) { aWizz = wizz; } else { aWizz = "default"; }

ট্রিনিয়ার অপারেটরটিকে স্কিমের (কনড ...) এর মতো কাজ করতে বেঁধে রাখা যেতে পারে:

(cond (predicate  (action  ...))
      (predicate2 (action2 ...))
      (#t         default ))

হিসাবে লেখা যেতে পারে ...

predicate  ? action( ... ) :
predicate2 ? action2( ... ) :
             default;

এটি খুব "কার্যকরী", কারণ এটি আপনার কোডটিকে পার্শ্ব প্রতিক্রিয়া ছাড়াই শাখা করে। এর পরিবর্তে:

if (predicate) {
  foo = "one";
} else if (predicate2) {
  foo = "two";
} else {
  foo = "default";
}

তুমি লিখতে পারো:

foo = predicate  ? "one" :
      predicate2 ? "two" :
                   "default";

পুনরাবৃত্তির সাথেও দুর্দান্ত কাজ করে :)


আপনার দেওয়া প্রিডিকেট সিনট্যাক্সটি আমি পছন্দ করি। আমি এরকম শৃঙ্খলিত করার কথা কখনও ভাবিনি। ঝরঝরে।
আল্লায় লালনোদে

2
আহ ... জাভাস্ক্রিপ্ট একটি সুইচ () বিবৃতি আছে। :-)
স্ট্যাটিকসান

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

14
আমি, এক জন্য, টার্নারি অপারেটর স্বাগত জানাই।
থোমাস্রুটার

8
পুনরায় পড়ার সময়, আমি এটি উল্লেখ করতে চাই যে এটি "কোডটিকে অন্য ভাষার মতো দেখাচ্ছে" নয়, তবে কোডের অর্থগত অর্থটি সহজ করে তুলছে: যখন আপনি "তিনটির মধ্যে একটিতে ফু" বলার চেষ্টা করছেন জিনিস ", এটি একটি বিবৃতি যা" foo = ... "দিয়ে শুরু করা উচিত," যদি "নয়।
আন্দ্রে ফেদোরভ

41

সংখ্যাগুলিও বস্তু। সুতরাং আপনি যেমন দুর্দান্ত জিনিস করতে পারেন:

// convert to base 2
(5).toString(2) // returns "101"

// provide built in iteration
Number.prototype.times = function(funct){
  if(typeof funct === 'function') {
    for(var i = 0;i < Math.floor(this);i++) {
      funct(i);
    }
  }
  return this;
}


(5).times(function(i){
  string += i+" ";
});
// string now equals "0 1 2 3 4 "

var x = 1000;

x.times(function(i){
  document.body.innerHTML += '<p>paragraph #'+i+'</p>';
});
// adds 1000 parapraphs to the document

ঈশ্বর! আমি টস্ট্রিং (র‌্যাডিক্স) সম্পর্কে জানতাম না ...
এটেস গোড়াল

1
যে প্রয়োগ timesকার্যকর নয়: Math.floorপ্রতিবার কেবল একবারের পরিবর্তে বলা হয়।
ডলম্যান

33

জাভাস্ক্রিপ্টে ক্লোজারগুলি সম্পর্কে কীভাবে (সি # ভি 2.0 + তে বেনাম পদ্ধতিগুলির সমান)। আপনি একটি ফাংশন তৈরি করতে পারেন যা একটি ফাংশন বা "এক্সপ্রেশন" তৈরি করে।

বন্ধের উদাহরণ :

//Takes a function that filters numbers and calls the function on 
//it to build up a list of numbers that satisfy the function.
function filter(filterFunction, numbers)
{
  var filteredNumbers = [];

  for (var index = 0; index < numbers.length; index++)
  {
    if (filterFunction(numbers[index]) == true)
    {
      filteredNumbers.push(numbers[index]);
    }
  }
  return filteredNumbers;
}

//Creates a function (closure) that will remember the value "lowerBound" 
//that gets passed in and keep a copy of it.
function buildGreaterThanFunction(lowerBound)
{
  return function (numberToCheck) {
    return (numberToCheck > lowerBound) ? true : false;
  };
}

var numbers = [1, 15, 20, 4, 11, 9, 77, 102, 6];

var greaterThan7 = buildGreaterThanFunction(7);
var greaterThan15 = buildGreaterThanFunction(15);

numbers = filter(greaterThan7, numbers);
alert('Greater Than 7: ' + numbers);

numbers = filter(greaterThan15, numbers);
alert('Greater Than 15: ' + numbers);

1
আমি অনিশ্চিত, তবে ফিরে আসতে পারি (নাম্বারটিচেক> লোয়ারবাউন্ড)? সত্য মিথ্যা; খালি রিটার্ন (নাম্বারটিচেক> লোয়ারবাউন্ড) হয়ে যান; কেবল আমার বোঝাপড়া বাড়ানোর চেষ্টা করছি ...
ডেভিডস ঘুম

4
আমি বলতে চাই যে সি # তে
বেনাম ফাংশনগুলি ক্লোজারের

11
বন্ধ এবং বেনামে ফাংশনগুলি পৃথক, স্বতন্ত্র ধারণা। নামকরণ না করেই এই ফাংশনগুলি তৈরি করা যায় বেনামী ফাংশনগুলি having 'ক্রিয়েটিং' স্কোপের কোনও ভেরিয়েবলটি তৈরি ফাংশনের সাথে যুক্ত হয় এটি একটি বন্ধ closure সংক্ষেপে, একটি বন্ধকরণ আরও গোপনীয় বৈকল্পিকের মতো।
slebetman

1
সেটা সত্য. শুধুমাত্র যখন বেনাম পদ্ধতিগুলি তৈরির সুযোগ থেকে কোনও পরিবর্তনশীল ব্যবহার করে তবে এটি বন্ধের মতো similar আমি উত্তরে ইংরেজি আপডেট করেছি। এটি এখনও পছন্দসই কিছু রেখে দেয়, তবে আমি সঠিক ইংরাজির জন্য হারিয়েছি a
টাইলার

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

32

আপনি প্রোটোটাইপ চেইন চামচ 16 এর জন্য সংজ্ঞায়িত করে ক্লাসগুলি প্রসারিত করতে পারেন এবং বৈশিষ্ট্যগুলি / পদ্ধতিগুলি ওভাররাইড করতে পারেন।

নিম্নলিখিত উদাহরণে আমরা একটি শ্রেণীর পোষা প্রাণী তৈরি করি এবং কয়েকটি বৈশিষ্ট্য সংজ্ঞায়িত করি। আমরা অবজেক্ট থেকে উত্তরাধিকারসূত্রে .toString () পদ্ধতি ওভাররাইড করি।

এর পরে আমরা একটি কুকুর শ্রেণি তৈরি করি যা পোষা প্রাণীকে প্রসারিত করে এবং আবার আচরণের ( পলিমারফিজম) পরিবর্তন করে .toString () পদ্ধতিটিকে ওভাররাইড করে । এছাড়াও আমরা শিশু শ্রেণিতে কিছু অন্যান্য বৈশিষ্ট্য যুক্ত করি।

এর পরে আমরা উত্তরাধিকার শৃঙ্খলাটি পরীক্ষা করে দেখি যে কুকুরটি এখনও কুকুর টাইপ কুকুর, পোষ্যের টাইপ এবং অবজেক্ট টাইপ করে type

// Defines a Pet class constructor 
function Pet(name) 
{
    this.getName = function() { return name; };
    this.setName = function(newName) { name = newName; };
}

// Adds the Pet.toString() function for all Pet objects
Pet.prototype.toString = function() 
{
    return 'This pets name is: ' + this.getName();
};
// end of class Pet

// Define Dog class constructor (Dog : Pet) 
function Dog(name, breed) 
{
    // think Dog : base(name) 
    Pet.call(this, name);
    this.getBreed = function() { return breed; };
}

// this makes Dog.prototype inherit from Pet.prototype
Dog.prototype = new Pet();

// Currently Pet.prototype.constructor
// points to Pet. We want our Dog instances'
// constructor to point to Dog.
Dog.prototype.constructor = Dog;

// Now we override Pet.prototype.toString
Dog.prototype.toString = function() 
{
    return 'This dogs name is: ' + this.getName() + 
        ', and its breed is: ' + this.getBreed();
};
// end of class Dog

var parrotty = new Pet('Parrotty the Parrot');
var dog = new Dog('Buddy', 'Great Dane');
// test the new toString()
alert(parrotty);
alert(dog);

// Testing instanceof (similar to the `is` operator)
alert('Is dog instance of Dog? ' + (dog instanceof Dog)); //true
alert('Is dog instance of Pet? ' + (dog instanceof Pet)); //true
alert('Is dog instance of Object? ' + (dog instanceof Object)); //true

এই প্রশ্নের উভয় উত্তরই ছিল রে দাজাজদিনাটকের একটি দুর্দান্ত এমএসডিএন নিবন্ধ থেকে কোডগুলি সংশোধিত


31

আপনি তাদের ধরণের উপর নির্ভর করে ব্যতিক্রমগুলি ধরতে পারেন। এমডিসি থেকে উদ্ধৃত :

try {
   myroutine(); // may throw three exceptions
} catch (e if e instanceof TypeError) {
   // statements to handle TypeError exceptions
} catch (e if e instanceof RangeError) {
   // statements to handle RangeError exceptions
} catch (e if e instanceof EvalError) {
   // statements to handle EvalError exceptions
} catch (e) {
   // statements to handle any unspecified exceptions
   logMyErrors(e); // pass exception object to error handler
}

দ্রষ্টব্য: শর্তসাপেক্ষ ক্যাচ ক্লজগুলি একটি নেটস্কেপ (এবং সেইজন্য মজিলা / ফায়ারফক্স) এক্সটেনশন যা ECMAScript নির্দিষ্টকরণের অংশ নয় এবং তাই নির্দিষ্ট ব্রাউজারগুলি ব্যতীত নির্ভর করা যায় না।


29
আমি এটি সাহায্য করতে পারি না: ধর (আপনি যদি ক্যান হন)
Ates Goral

6
আপনি উদ্ধৃত MDC পৃষ্ঠা থেকে নোটটি পড়ুন: শর্তসাপেক্ষ ক্যাচ ক্লজগুলি নেটস্কেপ (এবং সেইজন্য মজিলা / ফায়ারফক্স) এক্সটেনশন যা ECMAScript নির্দিষ্টকরণের অংশ নয় এবং তাই নির্দিষ্ট ব্রাউজারগুলি ব্যতীত নির্ভর করা যায় না।
জেসন এস

31

আমার মাথার উপরে...

ক্রিয়াকলাপ

আর্গুমেন্ট.ক্যাল্লি এমন ফাংশনকে বোঝায় যা "আর্গুমেন্ট" ভেরিয়েবলকে হোস্ট করে, তাই এটি বেনামে ফাংশন পুনরাবৃত্তি করতে ব্যবহার করা যেতে পারে:

var recurse = function() {
  if (condition) arguments.callee(); //calls recurse() again
}

আপনি যদি এরকম কিছু করতে চান তবে এটি দরকারী:

//do something to all array items within an array recursively
myArray.forEach(function(item) {
  if (item instanceof Array) item.forEach(arguments.callee)
  else {/*...*/}
})

অবজেক্টস

বস্তুর সদস্যদের সম্পর্কে একটি আকর্ষণীয় বিষয়: তাদের নামের মতো কোনও স্ট্রিং থাকতে পারে:

//these are normal object members
var obj = {
  a : function() {},
  b : function() {}
}
//but we can do this too
var rules = {
  ".layout .widget" : function(element) {},
  "a[href]" : function(element) {}
}
/* 
this snippet searches the page for elements that
match the CSS selectors and applies the respective function to them:
*/
for (var item in rules) {
  var elements = document.querySelectorAll(rules[item]);
  for (var e, i = 0; e = elements[i++];) rules[item](e);
}

স্ট্রিংস

স্ট্রিং.স্প্লিট প্যারামিটার হিসাবে নিয়মিত প্রকাশ করতে পারে:

"hello world   with  spaces".split(/\s+/g);
//returns an array: ["hello", "world", "with", "spaces"]

স্ট্রিং.রেপ্লেস অনুসন্ধানের পরামিতি হিসাবে নিয়মিত প্রকাশ করতে পারে এবং প্রতিস্থাপনের প্যারামিটার হিসাবে একটি ফাংশন নিতে পারে:

var i = 1;
"foo bar baz ".replace(/\s+/g, function() {return i++});
//returns "foo1bar2baz3"

আপনি যে জিনিসগুলি উল্লেখ করেছেন ... সেগুলি কি সমস্ত ব্রাউজারে প্রয়োগ করা হয়?
cllpse

4
না। আমি নিশ্চিত যে মোজাইক তাদের বেশিরভাগেরই অভাব রয়েছে।
জাইট

2
জাভাস্ক্রিপ্ট বৈশিষ্ট্যগুলি হ্যাঁ, এগুলি সমস্ত বড় ব্রাউজারগুলিতে (আই 6/7, এফএফ 2/3, অপেরা 9+, সাফারি 2/3 এবং Chrome) প্রয়োগ করা হয়। ডকুমেন্ট.কোয়ারিসিলিটরআল সব ব্রাউজারে এখনও সমর্থিত নয় (এটি জিকুয়ারির W (), এবং প্রোটোটাইপের $$ ()) এর ডাব্লু 3 সি সংস্করণ
লিও

6
arguments.calleeহ্রাস করা হয়েছে এবং ECMAScript 5 এ
নিক্ষিপ্ত

বেশ সত্য নয়। একটি অবজেক্ট কী (বা পরিবর্তে, উচিত নয়) "hasOwnProperty" স্ট্রিংটিকে নাম হিসাবে ব্যবহার করতে পারে না, কারণ এটি বিল্ট ইন অবজেক্ট পদ্ধতিতে ওভাররাইড করে।
ব্রেটন

29

আপনি বেশিরভাগ সময় সুইচের পরিবর্তে অবজেক্ট ব্যবহার করতে পারেন।

function getInnerText(o){
    return o === null? null : {
        string: o,
        array: o.map(getInnerText).join(""),
        object:getInnerText(o["childNodes"])
    }[typeis(o)];
}

আপডেট: আপনি যদি আগে থেকে মূল্যায়নযোগ্য কেসগুলি অদক্ষ হওয়ার বিষয়ে উদ্বিগ্ন হন (তবে প্রোগ্রামের ডিজাইনের ক্ষেত্রে আপনি দক্ষতার বিষয়ে কেন উদ্বিগ্ন ??) তবে আপনি এরকম কিছু করতে পারেন:

function getInnerText(o){
    return o === null? null : {
        string: function() { return o;},
        array: function() { return o.map(getInnerText).join(""); },
        object: function () { return getInnerText(o["childNodes"]; ) }
    }[typeis(o)]();
}

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

আপডেট 2: ES.next এর প্রস্তাবিত সিনট্যাক্স এক্সটেনশন সহ এটি হয়ে যায়

let getInnerText = o -> ({
    string: o -> o,
    array: o -> o.map(getInnerText).join(""),
    object: o -> getInnerText(o["childNodes"])
}[ typeis o ] || (->null) )(o);

3
সুইচ স্টেটমেন্ট না দিয়ে পাইথন এভাবে চলে যায়।
outis

2
সমস্যাটি হ'ল এটি সর্বদা সমস্ত ক্ষেত্রে মূল্যায়ন করে।
কর্নেল

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

ওহ হ্যাঁ, এবং আবার স্কেল্যাবিলিটি জিনিসটির জন্য, কোনও বস্তু সহজেই একটি বাহ্যিক কনফিগারেশন বা ডেটা ফাইলের মধ্যে ছড়িয়ে দেওয়া যেতে পারে, যা একটি সুইচ স্টেটমেন্টের চেয়ে কিছুটা আরও সোজাসাপ্টা পরিবর্তন But তবে তুচ্ছ যদি মনে হয় কোনও বিষয় মনে রেখে ডিজাইন করা হয়েছে সঙ্গে.
ব্রেটন

আমি জানি এটি একটি দেরীতে প্রবেশ, তবে আপনার যদি কাস্টম টাইপ-চেকিং যুক্তি না থাকে তবে কোন অ্যারে কখন আপনার উদাহরণ দিয়ে কাজ করবে? var arr = []; typeof arr; // object
কিগানওয়াতকিন্স

25

কোনও বস্তুর বৈশিষ্ট্যগুলির মাধ্যমে পুনরাবৃত্তি করার সময় hasOwnProperty পদ্ধতিটি ব্যবহার নিশ্চিত করুন :

for (p in anObject) {
    if (anObject.hasOwnProperty(p)) {
        //Do stuff with p here
    }
}

এটি করা হয়েছে যাতে আপনি কেবল anObject এর প্রত্যক্ষ বৈশিষ্ট্য অ্যাক্সেস করতে পারবেন এবং প্রোটোটাইপ শৃঙ্খলে থাকা বৈশিষ্ট্যগুলি ব্যবহার করবেন না।


23

পাবলিক ইন্টারফেস সহ ব্যক্তিগত ভেরিয়েবল

এটি একটি স্ব-কলিং ফাংশন সংজ্ঞা সহ একটি ঝরঝরে সামান্য কৌশল ব্যবহার করে। প্রত্যাবর্তিত অবজেক্টের ভিতরে থাকা সমস্ত কিছু পাবলিক ইন্টারফেসে উপলভ্য, অন্য সমস্ত কিছু ব্যক্তিগত।

var test = function () {
    //private members
    var x = 1;
    var y = function () {
        return x * 2;
    };
    //public interface
    return {
        setx : function (newx) {
            x = newx;
        },
        gety : function () {
            return y();
        }
    }
}();

assert(undefined == test.x);
assert(undefined == test.y);
assert(2 == test.gety());
test.setx(5);
assert(10 == test.gety());

1
একে মডিউল প্যাটার্ন বলা হয়, যেমনটি ডাব করা হয়েছিল যে এরিক মীরাগলিয়া দ্বারা yuiblog.com/blog/2007/06/12/module- Pattern আমি মনে করি নামটি বিভ্রান্তিমূলক, সিঙ্গেলটন প্যাটার্ন বা এর মতো কিছু বলা উচিত। আমি আরও যুক্ত করতে পারি যে পাবলিক পদ্ধতিগুলি এই 'অবজেক্ট' ব্যবহার করে অন্যান্য পাবলিক পদ্ধতিতেও কল করতে পারে। জিনিসগুলিকে সংগঠিত এবং পরিষ্কার রাখতে আমি আমার কোডটিতে এই প্যাটার্নটি সর্বদা ব্যবহার করি।
মাইকাইকগ্টো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.