জাভাস্ক্রিপ্ট এর "সহ" বিবৃতি জন্য বৈধ ব্যবহার আছে?


369

withবিবৃতি সংক্রান্ত আমার উত্তরের জবাবে অ্যালান স্টর্মের মন্তব্য আমাকে ভাবতে পেরেছিল। আমি খুব কমই এই বিশেষ ভাষা বৈশিষ্ট্যটি ব্যবহার করার কারণ খুঁজে পেয়েছি এবং এটি কীভাবে সমস্যা সৃষ্টি করতে পারে সে বিষয়ে খুব একটা চিন্তাও করেনি। এখন, আমি কীভাবে কার্যকর ব্যবহার করতে পারি সে সম্পর্কে আমি কৌতূহলী with, এর ক্ষতিগুলি এড়িয়ে গিয়ে।

আপনি withবিবৃতিটি কোথায় দরকারী পেয়েছেন?


52
আমি কখনই এটি ব্যবহার করি না। আমি যদি এটির উপস্থিতি না রাখি তবে এটি ছাড়া বেঁচে থাকা সহজ।
নসরেডনা

6
এটির জন্য একবারে অনেকগুলি বৈধ ব্যবহার থাকতে পারে। তবে তা নষ্ট ES5 স্ট্রিক্ট সরানো হয়েছে withসুতরাং আর কোনও জিনিস নেই।
থমাস অাইলট

27
ওয়ার্থ এখানে লক্ষ করেন, ES5 কঠোর এখনও ঐচ্ছিক
শোগ 9

5
ES5 কঠোরভাবে 'সহ' অপসারণের পরিবর্তে, মানটি পরিবর্তন করা ভাল ছিল না যাতে যদি কোনও ভেরিয়েবল পাওয়া না যায়, তবে 'সহ' ভিতরে তৈরি করা কোনও কার্যনির্বাহী আর্গুমেন্টের সাথে আবদ্ধ হয়?
JussiR

2
@ জুসিআর: সম্ভবত। তবে এটি করার ক্ষেত্রে সমস্যাটি হ'ল এটি সম্ভবত পুরানো ব্রাউজারগুলিতে জিনিসগুলি ভেঙে দেয়।
সুনে রাসমুসেন

উত্তর:


520

আমার কাছে আজ অন্য একটি ব্যবহার ঘটেছিল, তাই আমি উত্তেজিতভাবে ওয়েবটি অনুসন্ধান করেছি এবং এর একটি বিদ্যমান উল্লেখ পেয়েছি: ব্লক স্কোপের অভ্যন্তরে পরিবর্তনশীল সংজ্ঞা দেওয়া

পটভূমি

জাভাস্ক্রিপ্ট, এর সি ও সি ++ এর অতি পৃষ্ঠপোষক সাদৃশ্য থাকা সত্ত্বেও, ব্লকটিতে তাদের সংজ্ঞায়িত ব্লকের ক্ষেত্রে স্কোপ পরিবর্তন করে না:

var name = "Joe";
if ( true )
{
   var name = "Jack";
}
// name now contains "Jack"

লুপে বন্ধ ঘোষণা করা একটি সাধারণ কাজ যেখানে এর ফলে ত্রুটি হতে পারে:

for (var i=0; i<3; ++i)
{
   var num = i;
   setTimeout(function() { alert(num); }, 10);
}

কারণ লুপটি কোনও নতুন সুযোগ প্রবর্তন করে না, একই num- এর মান সহ 2- তিনটি ফাংশন ভাগ করে নেওয়া হবে।

একটি নতুন সুযোগ: letএবংwith

ES6letবিবৃতি প্রবর্তনের সাথে সাথে , এই সমস্যাগুলি এড়াতে যখন প্রয়োজন হবে তখন একটি নতুন সুযোগ প্রবর্তন করা সহজ হয়ে যায়:

// variables introduced in this statement 
// are scoped to each iteration of the loop
for (let i=0; i<3; ++i)
{
   setTimeout(function() { alert(i); }, 10);
}

অথবা এমনকি:

for (var i=0; i<3; ++i)
{
   // variables introduced in this statement 
   // are scoped to the block containing it.
   let num = i;
   setTimeout(function() { alert(num); }, 10);
}

ES6 সর্বজনীনভাবে উপলব্ধ না হওয়া অবধি, এই ব্যবহারটি সর্বাধিক নতুন ব্রাউজার এবং ট্রান্সপোর্টারগুলি ব্যবহার করতে ইচ্ছুক বিকাশকারীদের মধ্যে সীমাবদ্ধ রয়েছে। তবে আমরা সহজেই ব্যবহার করে এই আচরণটি অনুকরণ করতে পারি with:

for (var i=0; i<3; ++i)
{
   // object members introduced in this statement 
   // are scoped to the block following it.
   with ({num: i})
   {
      setTimeout(function() { alert(num); }, 10);
   }
}

লুপটি এখন ইচ্ছাকৃত হিসাবে কাজ করে, 0 থেকে 2 পর্যন্ত মান সহ তিনটি পৃথক ভেরিয়েবল তৈরি করে নোট করুন যে ব্লকের মধ্যে ঘোষিত ভেরিয়েবলগুলি এটিকে স্কুপ করা হয় না, সি ++ (সিতে, ভেরিয়েবলগুলির শুরুতে ঘোষিত হতে হবে একটি ব্লক, সুতরাং এটি একরকম হয়)। এই আচরণটি মজিলা ব্রাউজারগুলির পূর্ববর্তী সংস্করণগুলিতে প্রবর্তিত letব্লক সিনট্যাক্সের সাথে বেশ মিল , তবে অন্য কোথাও ব্যাপকভাবে গৃহীত হয় নি।


15
আক্ষরিক সাথে ব্যবহার করার কথা ভাবেন নি, বৈধ বলে মনে হচ্ছে।
ম্যাট ক্যান্টর

81
এটি সত্যিই মারা গেছে। আমি কখনই জাভাস্ক্রিপ্টের স্কোপ দিয়ে এইভাবে খেলতে ভাবিনি। সম্পূর্ণভাবে আমার কোডিংয়ে নতুন অঞ্চল প্রসারিত। আমি যদি 10 বার উপার্জন করতে পারি!
kizzx2

27
তবুও যারা বিরোধিতা করেছে তাদের পক্ষে, সর্বদা একটি বন্ধ ব্যবহার করা যেতে পারে:for (var i = 0; i < 3; ++i) { setTimeout ((function () { var num = i; return function () { alert (num); }; }) (), 10);}
টমাস এডিং

4
প্রকৃতপক্ষে, উপরে লিঙ্কযুক্ত সমস্যাটি বেশিরভাগ মোজিলা ব্রাউজারগুলিতে (ক্রোম, সাফারি, অপেরা, আইই) প্রদর্শিত হয় appears
সর্বোচ্চ শওয়াবকেহ

24
দিন IE তে বক্তব্য সমর্থন সত্যিই ডান এখন আমার বেকন বাঁচাতে হবে, আমি থাকুক বা না থাকুক ব্যবহার করার জন্য আমার বিবেকের সঙ্গে সংগ্রাম করছি সঙ্গে পরিবর্তে। বাস্তব সমস্যা এমনকি একটি সঙ্গে যে সঙ্গে হিসেবে এলইটি , অতিরিক্ত যত্ন এখনও কারণ প্রোটোটাইপ চেইনের একটি বস্তুর উত্তরাধিকারসূত্রে বৈশিষ্ট্য গ্রহণ করা হয়েছে। উদাহরণস্বরূপ var toString = function () { return "Hello"; }; with ({"test":1}) { console.log(toString()); };,। সুযোগ সঙ্গে বিবৃতি toString () একজন উত্তরাধিকারসূত্রে সম্পত্তি অবজেক্ট , তাই স্পষ্টভাবে সংজ্ঞায়িত কার্যকারিতা বলা হয় না। এখনও একটি দুর্দান্ত উত্তর, যদিও :-)
অ্যান্ডি ই

161

আমি স্কোপড আমদানির একটি সাধারণ ফর্ম হিসাবে উইথ স্টেটমেন্টটি ব্যবহার করছি। ধরা যাক আপনার কোনও ধরণের মার্কআপ বিল্ডার রয়েছে। লেখার চেয়ে:

markupbuilder.div(
  markupbuilder.p('Hi! I am a paragraph!',
    markupbuilder.span('I am a span inside a paragraph')
  )
)

আপনি পরিবর্তে লিখতে পারে:

with(markupbuilder){
  div(
    p('Hi! I am a paragraph!',
      span('I am a span inside a paragraph')
    )
  )
}

এই ব্যবহারের ক্ষেত্রে, আমি কোনও অ্যাসাইনমেন্ট করছি না, সুতরাং এর সাথে আমার অস্পষ্টতার সমস্যা নেই।


5
এটি আমি ভিবিতে এটি ব্যবহার করে দেখেছি। (এবং একমাত্র ব্যবহার সম্পর্কে আমি সচেতন ছিলাম))
মতিন উলহাক

2
এর একটি নেতিবাচক দিকটি হ'ল যদি আপনি মার্কআপবিল্ডার অবজেক্টের বাইরে থাকা ব্লকের সাথে একটি পরিবর্তনশীল উল্লেখ করেন তবে জেএস ইঞ্জিন প্রথমে যাইহোক মার্কআপ বিল্ডারের ভিতরে এটি অনুসন্ধান করবে, কর্মক্ষমতা হ্রাস করবে।
অ্যাডাম থমাস

3
এটি সত্যই ক্যানভাস পাথগুলির সাথে কাজ করে তাদের কোডকে হ্রাস করতে সহায়তা করে।
ব্রায়ান ম্যাকচ্যাটন

4
সেই কোডটির "সহ" সংস্করণটি আমার মেশিনে "নন-উইথ" সংস্করণের তুলনায় আক্ষরিকভাবে 240 বারের চেয়ে ধীরে চলে । এই কারণেই লোকেরা বলে যে এর কোনও বৈধ ব্যবহার নেই। কিছু স্পটে কোড প্রিটিটিয়ার তৈরি করতে পারে না বলে নয়। বেঞ্চমার্ক দেখুন: jsfiddle.net/sc46eeyn
জনি

1
@ ম্যাকব্রেইনি - এটি ঠিক সেই ধরণের জায়গা যা আপনার পক্ষে কোড ব্যবহার করা উচিত নয় যা বহু লোককে ধীর করে দেয় (আমি এই মন্তব্যটির উপরে আমি কী মন্তব্য করেছি তা দেখুন)। সুপার পুনরাবৃত্ত কোডের জন্য আপনার যদি শর্টকাট প্রয়োজন হয় তবে আপনি সেগুলি ঘোষণা করতে পারেন। উদাহরণস্বরূপ যদি context.bezierCurveToএকশ বার সরাসরি ব্যবহার করে আপনি বলতে পারেন var bc2 = context.bezierCurveTo;এবং তারপরে যান gobc2(x,x,etc); আপনি যখনই কল করতে চান । এটি বেশ দ্রুত এবং এমনকি কম ভার্বোস, যদিও withসুপার ধীর।
জিম্বো জনি 26'15

83

আমার পূর্ববর্তী মন্তব্যগুলি ইঙ্গিত হিসাবে, আমি মনে করি না যে আপনি withযে কোনও পরিস্থিতিতে যেই প্রলোভনীয় হোক না কেন আপনি নিরাপদে ব্যবহার করতে পারবেন । যেহেতু সমস্যাটি এখানে সরাসরি আচ্ছাদিত নয়, তাই আমি এটি আবার করব। নিম্নলিখিত কোড বিবেচনা করুন

user = {};
someFunctionThatDoesStuffToUser(user);
someOtherFunction(user);

with(user){
    name = 'Bob';
    age  = 20;
}

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

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

আধুনিক প্রোগ্রামিং ভাষার বৈশিষ্ট্যগুলি পূর্ণ of কিছু বৈশিষ্ট্য, ব্যবহারের বছর পরে, খারাপ হিসাবে আবিষ্কার করা হয়েছে, এবং এড়ানো উচিত। জাভাস্ক্রিপ্ট এর withমধ্যে একটি।


18
আপনি যখন বস্তুর বৈশিষ্ট্যের জন্য মান নির্ধারণ করছেন তখন এই সমস্যাটি কেবলমাত্র তত্পর হয়। তবে আপনি যদি এটি কেবল মানগুলি পড়তে ব্যবহার করেন? আমি যুক্তি দিচ্ছি যে এই ক্ষেত্রে এটি ব্যবহার করা ঠিক আছে।
এয়ারপোর্টে

10
টোবি মানগুলি পড়তে একই সমস্যা প্রযোজ্য। উপরের কোড স্নিপেটে আপনি জানেন না যে নাম ব্যবহারকারীর অবজেক্টে সেট করা আছে কি না, তাই আপনি বিশ্বব্যাপী নাম বা ব্যবহারকারীর নাম পড়ছিলেন কিনা তা আপনি জানতে পারবেন না।
অ্যালান ঝড়

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

1
আমি মনে করি আপনি ঠিক সেখানে থাকতে পারেন টবি। লেখার সমস্যাটি সম্পূর্ণরূপে নির্মাণ থেকে লজ্জিত হওয়ার জন্য আমার পক্ষে যথেষ্ট।
অ্যালান ঝড় 16

"এটি অনেকটা স্যুইচটিতে পড়ে যাওয়ার মতো, আপনার কোনও ধারণা নেই ..." - তাহলে আসুন তাহলে সুইচটিও () নিষিদ্ধ করুন? ;-p
SZ।

66

আমি withসম্প্রতি বিবৃতিটি অবিশ্বাস্যভাবে কার্যকর বলে মনে করেছি। আমি আমার বর্তমান প্রকল্প শুরু না করা অবধি এই কৌশলটি আমার কাছে আসলে কখনও আসেনি - জাভাস্ক্রিপ্টে লিখিত একটি কমান্ড লাইন কনসোল। আমি ফায়ারব্যাগ / ওয়েবকিট কনসোল এপিআইগুলি অনুকরণ করার চেষ্টা করছিলাম যেখানে বিশেষ কমান্ডগুলি কনসোলে প্রবেশ করা যেতে পারে তবে তারা বিশ্বব্যাপী স্কোপগুলিতে কোনও পরিবর্তনকে ওভাররাইড করে না। আমি শোগ 9 এর দুর্দান্ত উত্তরের মন্তব্যে উল্লিখিত কোনও সমস্যা কাটিয়ে উঠার চেষ্টা করার সময় আমি এই ভেবেছিলাম ।

এই প্রভাবটি অর্জন করতে, আমি বিশ্বব্যাপী স্কোপের পিছনে একটি সুযোগ "স্তর" করতে স্টেটমেন্ট সহ দুটি ব্যবহার করেছি:

with (consoleCommands) {
    with (window) {
        eval(expression); 
    }
}

এই কৌশলটি সম্পর্কে দুর্দান্ত বিষয়টি হল পারফরম্যান্সের অসুবিধাগুলি বাদ দিয়ে এটি এর স্বাভাবিক ভীতি ভোগ করে না with বিবৃতিটির মুখোমুখি , কারণ আমরা যেভাবেই বিশ্বব্যাপী ক্ষেত্রের মধ্যে মূল্যায়ন করছি - আমাদের সিউডো-স্কোপের বাইরে ভেরিয়েবলের কোনও বিপদ নেই there's রুপান্তরিত করা হয়েছে।

আমি এই উত্তরটি পোস্ট করতে অনুপ্রাণিত হয়ে যখন আমার অবাক হয়ে যায়, আমি একই কৌশল অন্য কোথাও ব্যবহার করতে সক্ষম হয়েছি - ক্রোমিয়াম উত্স কোড !

InjectedScript._evaluateOn = function(evalFunction, object, expression) {
    InjectedScript._ensureCommandLineAPIInstalled();
    // Surround the expression in with statements to inject our command line API so that
    // the window object properties still take more precedent than our API functions.
    expression = "with (window._inspectorCommandLineAPI) { with (window) { " + expression + " } }";
    return evalFunction.call(object, expression);
}

সম্পাদনা: সবেমাত্র ফায়ারব্যাগ উত্সটি পরীক্ষা করে দেখুন, তারা আরও বেশি স্তরগুলির জন্য একসাথে বিবৃতি দিয়ে 4 চেইন করে। ক্রেজি!

const evalScript = "with (__win__.__scope__.vars) { with (__win__.__scope__.api) { with (__win__.__scope__.userVars) { with (__win__) {" +
    "try {" +
        "__win__.__scope__.callback(eval(__win__.__scope__.expr));" +
    "} catch (exc) {" +
        "__win__.__scope__.callback(exc, true);" +
    "}" +
"}}}}";

1
তবে উদ্বেগ যে বাস্তু স্ক্রিপ্ট 5 আপনাকে এটি করতে বাধা দেয়। একটি বাস্তু স্ক্রিপ্ট 5 সমাধান আছে?
কায়বারনেটিকোস

@ অ্যাডাম: আমি সে সম্পর্কে নিশ্চিত নই। ES5 কেবলমাত্র এর জন্য কঠোর মোডে একটি ত্রুটি ছুড়ে দেয়, তাই বিশ্বব্যাপী আপনার কাছে কড়া মোড না ঘোষণা করা যদি তা তাত্ক্ষণিক সমস্যা হয় না। ইএস হারমনি আরও বড় সমস্যা হতে পারে তবে প্রক্সিগুলির মতো নতুন কিছুতে এটি ঠিক করা যেতে পারে।
অ্যান্ডি ই

@ অ্যান্ডি দুঃখিত, এটি বিষয় ছাড়াই বন্ধ, তবে আপনার 'জাভাস্ক্রিপ্টে লিখিত কমান্ড লাইন কনসোল' কোথাও পাওয়া যায়?
কায়বারনেটিকোস

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

3
কয়েক সপ্তাহ আগে আমরা ক্রোমে আমাদের কনসোল প্রয়োগকে ব্লক সহ কিছু প্রতীক যাদুতে স্থানান্তরিত করেছি কারণ ব্লক দিয়ে কিছু ES6 বৈশিষ্ট্য অবরুদ্ধ করেছে :)
আলেক্সি কোজিয়াটিনস্কি

54

হ্যাঁ, হ্যাঁ এবং হ্যাঁ একটি খুব বৈধ ব্যবহার আছে। ঘড়ি:

with (document.getElementById("blah").style) {
    background = "black";
    color = "blue";
    border = "1px solid green";
}

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

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

var element = document.createElement("div"),
    elementStyle = element.style;

elementStyle.fontWeight = "bold";
elementStyle.fontSize = "1.5em";
elementStyle.color = "#55d";
elementStyle.marginLeft = "2px";

ইত্যাদি ...


5
হিসাবে +1 আমিও মনে করি বৈধ ব্যবহার সম্পর্কে প্রচুর আছে with। যাইহোক, এই বিশেষ ক্ষেত্রে আপনি কেবল এটি করতে পারেন:element.style.cssText="background: black ; color: blue ; border: 1px solid green"
getFree

5
আপনি সহজ ব্যবহার এক লাইন একই জিনিস অর্জন করতে পারে extendপারেন jQuery এর বা Underscore.js থেকে পদ্ধতি: $.extend(element.style, {fontWeight: 'bold', fontSize: '1.5em', color: '#55d', marginLeft: '2px'})
ট্রেভর বার্নহ্যাম

9
@ ট্র্যাভার বার্নহ্যাম - আপনি যদি ধরে নিচ্ছেন যে jQuery পাওয়া যায়, আপনি কেবল তার .css()পদ্ধতিটি ব্যবহার করবেন ...
এনএনএনএনএনএন

4
এই পরিবর্তনগুলি বিশ্বব্যাপী সুযোগে যেতে বাধা দিচ্ছে কি? এটি কি কারণ সমস্ত সিএসএস শৈলী সর্বদা সমস্ত উপাদানের উপর সংজ্ঞায়িত হয়, বা কী?
এমপেন

1
@ মার্ক হ্যাঁ, কোনও সম্পত্তির জন্য কাস্টম স্টাইল না থাকলে মান হিসাবে নালাগুলি বা খালি স্ট্রিং সহ এগুলি সর্বদা সংজ্ঞায়িত করা হয়
ইসাইলিজা

34

withঅস্পষ্টতা ছাড়াই আপনি সুবিধার জন্য একটি ছোট সহায়ক ফাংশন সংজ্ঞায়িত করতে পারেন :

var with_ = function (obj, func) { func (obj); };

with_ (object_name_here, function (_)
{
    _.a = "foo";
    _.b = "bar";
});

8
ওএমজি, আমার হেড এক্সপ্লোড! অস্পষ্টতা ছাড়া ? ভোট দেই, মানুষ!
টেকনোলজি ডিক্সন

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

14
তবে এটি করার পদ্ধতিটি বোঝার জন্য এটি আরও দীর্ঘ এবং শক্ত: var _ = obj_name_ এখানে; _.a = "foo বিন্যাস"; _.b = "বার;
রিনি সরসু

3
পুনর্নবীকরণ: এটির সাহায্যে আপনি "_" ভেরিয়েবলটি বহিরাগত সুযোগে প্রকাশ করবেন, ফলস্বরূপ সম্ভাব্য বাগগুলি। এটি অবজেক্টের পরামিতি গণনায় ব্যবহৃত যে কোনও অস্থায়ী পরিবর্তনগুলিও প্রকাশ করবে।
জন মিলিকিন

30
আপনি with_জঞ্জাল দ্বিগুণ সংস্করণ হতে আরও বাগ পাবেন (function(_){ _.a="foo"; })(object_here);(সি / জাভা-স্টাইল ব্লকগুলি অনুকরণের মানক উপায়)। পরিবর্তে এটি ব্যবহার করুন।
এমকে

25

আপনি নিম্নলিখিতগুলি করতে পারছেন বলেই খুব কমই এটি উপযুক্ত বলে মনে হচ্ছে:

var o = incrediblyLongObjectNameThatNoOneWouldUse;
o.name = "Bob";
o.age = "50";

1
এটি আমার কাছে কোনও ধারণা রাখেনি। যদিও আমি জাভাস্ক্রিপ্টে বিশেষজ্ঞ নই
জেরোইনজাইফফ

@ ওমাস্টারজে স্পষ্টতার জন্য এই পোস্টটি দেখুন: yuiblog.com/blog/2006/04/11/with-statement-considered-harmful
ডেনিস

8
দীর্ঘ পরিবর্তনশীল নামগুলি কেবলমাত্র ব্যবহারের ক্ষেত্রে নয় with
ক্রিস

18

আমি কখনই এর সাথে ব্যবহার করি না, এর কোনও কারণ দেখতে পাচ্ছি না এবং এটির প্রস্তাব দিই না।

সমস্যাটি withহ'ল এটি বহু লেজিকাল অপটিমাইজেশন প্রতিরোধ করে একটি ইসমাস্ক্রিপ্ট বাস্তবায়ন সম্পাদন করতে পারে এমন । দ্রুত জেআইটি-ভিত্তিক ইঞ্জিনগুলির উত্থানের পরিপ্রেক্ষিতে অদূর ভবিষ্যতে এই বিষয়টি সম্ভবত আরও গুরুত্বপূর্ণ হয়ে উঠবে।

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


6
পারফরম্যান্স বোজিম্যান প্রায়শই গ্লোবাল জিনিস হিসাবে প্রায়শই খুঁজে পাওয়া যায় ... সর্বদা আমাকে বিজোড় হিসাবে আঘাত করে, এটি যে জাভাস্ক্রিপ্টের সাথে আমরা কথা বলছি তা প্রদত্ত given আপনি ধরে নিতে পারেন যে পারফরম্যান্স হিটটি এতটা মনোযোগের সত্যতা পাওয়ার জন্য সত্যই নাটকীয় , তবে ... with(){}আধুনিক উত্তর ব্রাউজারগুলিতে অন্যান্য উত্তরগুলিতে যেমন রচনাগুলির ব্যয়গুলির জন্য আপনার যদি কোনও হার্ড সংখ্যা থাকে তবে আমি দেখতে পছন্দ করব তাদের!
শোগ 9

6
জাভাস্ক্রিপ্টের প্রসঙ্গে এটি কেন অদ্ভুত? :) এবং হ্যাঁ, এটি নাটকীয়। এটি সম্পর্কে ভাবুন - একটি বাস্তবায়নের জন্য প্রথম বন্ধনীতে একটি অভিব্যক্তি মূল্যায়ন করা উচিত, এটিকে বস্তুতে রূপান্তর করা উচিত, এটি বর্তমান স্কোপ চেইনের সামনের অংশে সন্নিবেশ করাতে হবে, ব্লকের ভিতরে বিবৃতিটি মূল্যায়ন করতে হবে, তারপরে স্কোপ চেইনটিকে স্বাভাবিক অবস্থায় ফিরিয়ে আনতে হবে। এটা অনেক কাজ। একটি সাধারণ সম্পত্তি অনুসন্ধানের চেয়ে অনেক বেশি যা উচ্চ-অনুকূলিত নিম্ন স্তরের কোডে রূপান্তরিত হতে পারে। এখানে আমি খুব সহজ একটি বেঞ্চমার্ক দিয়েছি (আমি যদি আপনার কোনও ভুল খুঁজে পান তবে আমাকে জানান) পার্থক্যটি প্রকাশ করে - gist.github.com/c36ea485926806020024
kangax

5
@ কংগ্যাক্স: আমি একটি সি ++ ব্যাকগ্রাউন্ড থেকে এসেছি, যেখানে অনেক প্রোগ্রামার তাদের কোডের ছোট কার্যকারিতা সম্পর্কে অবলম্বন করার জন্য এটি প্রচলিত .তিহ্যবাহী, এমনকি যদি তারা বৃহত্তর রুটিন বা প্রোগ্রামের কার্য সম্পাদনের ক্ষেত্রে কোনও প্রভাব ফেলতে পারে না। জাভাস্ক্রিপ্টের প্রসঙ্গে এটি আমার কাছে অদ্ভুত বলে মনে হচ্ছে, যেখানে একটি রুটিনের পারফরম্যান্সের এত বড় অংশ ভিএম বাস্তবায়নের উপর নির্ভর করতে পারে। আমি কয়েকটি উদাহরণ দেখেছি যেখানে জেএস প্রোগ্রামাররা সেটআপ ব্যয় নিয়ে উদ্বেগের কারণে একটি বেনামি ফাংশন এড়িয়ে চলবে, তবে কোডের খুব সংবেদনশীল ক্ষেত্রের জন্য সংরক্ষিত এই নিয়ম নয়, এটি ব্যতিক্রম বলে মনে হয়।
শোগ 9

5
এটি বলেছিল, আপনি ব্যয়ের ক্ষেত্রে একদম সঠিক with(){}: withআমার পরীক্ষা করা প্রতিটি ব্রাউজারের সাথে একটি নতুন সুযোগ স্থাপন করা অত্যন্ত ব্যয়বহুল। আপনি যে কোনও কোডে খুব ঘন ঘন এটিকে এড়াতে চান। তদতিরিক্ত, ক্রোম কোনও with()সুযোগের মধ্যে কার্যকরকারী কোনও কোডের জন্য একটি নাটকীয় হিট প্রদর্শন করেছিল । মজার বিষয় হল, with()ব্লকের মধ্যে কোডের জন্য আইইয়ের সর্বোত্তম পারফরম্যান্স বৈশিষ্ট্য ছিল : সেটআপ ব্যয়টি ফ্যাক্টরিং করা , আই 6 এবং আই with()88 ভিএমগুলিতে সদস্যদের অ্যাক্সেসের দ্রুততম উপায় সরবরাহ করে (যদিও এই ভিএমগুলি সামগ্রিকভাবে ধীরতম হয়)। ভাল স্টাফ, ধন্যবাদ ...
Shog9

5
এফডাব্লুআইডাব্লু: সেটআপ ব্যয়ের সাথে এখানে পরীক্ষার সমান সেট রয়েছে: jsbin.com/imidu/edit এর জন্য ভেরিয়েবল অ্যাক্সেস with()প্রায় ক্রোমের তীব্রতার ধীরে ধীরে ক্রম, এবং আইআই তে দ্বিগুণ দ্রুত ...!
শোগ 9

13

ভিজ্যুয়াল বেসিক.নেট এর অনুরূপ Withবিবৃতি রয়েছে। আমি এটি ব্যবহার করার সবচেয়ে সাধারণ উপায়গুলির মধ্যে একটি হ'ল দ্রুত বেশ কয়েকটি বৈশিষ্ট্য সেট করা। পরিবর্তে:

someObject.Foo = ''
someObject.Bar = ''
someObject.Baz = ''

, আমি লিখতে পারি:

With someObject
    .Foo = ''
    .Bar = ''
    .Baz = ''
End With

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

With someObject
    .Foo = ''
End With

বনাম

With someObject
    Foo = ''
End With

আগেরটি হ'ল someObject.Foo; পরেরটি বাইরেরFoo সুযোগে রয়েছে । someObject

আমি দেখতে পেয়েছি যে জাভাস্ক্রিপ্টের পার্থক্যের অভাব এটিকে ভিজ্যুয়াল বেসিকের বৈকল্পিকের চেয়ে অনেক কম দরকারী করে তোলে, কারণ অস্পষ্টতার ঝুঁকি খুব বেশি। তা ছাড়া, withএখনও একটি শক্তিশালী ধারণা যা আরও ভাল পাঠযোগ্যতার জন্য তৈরি করতে পারে।


2
যথেষ্ট সত্য। যদিও তার প্রশ্নের উত্তর দেয় না। সুতরাং এটি বন্ধ বিষয়।
আল্লায় লালোন্ড

6
এটি আমার মনের মধ্যে দিয়ে চলছিল। কেউ এটা বলতে হয়েছে । জাভাস্ক্রিপ্টের কেন কেবল বিন্দু থাকতে পারে না।
কারসন মায়ার্স

সম্মত, ডট সংকেত উচ্চতর, কাঙ্ক্ষিত জাভাস্ক্রিপ্ট এটি ব্যবহার করে। +1

8

আপনি withকোনও ছোট্ট টেমপ্লেট ইঞ্জিনের সাহায্যে কোনও অবজেক্টের সামগ্রী স্থানীয় ব্লক হিসাবে পরিবর্তনশীল হিসাবে পরিচয় করিয়ে দিতে পারেন ।


1
এই কৌশলটি আন্ডারস্কোর.জেএস এর _.টিম্পলেট () এও ব্যবহৃত হচ্ছে ।
পিটার ভি।

7

"সহ" ব্যবহার করা আপনার কোডটিকে আরও শুষ্ক করে তুলতে পারে।

নিম্নলিখিত কোড বিবেচনা করুন:

var photo = document.getElementById('photo');
photo.style.position = 'absolute';
photo.style.left = '10px';
photo.style.top = '10px';

আপনি এটি নিম্নলিখিতটি শুকিয়ে নিতে পারেন:

with(document.getElementById('photo').style) {
  position = 'absolute';
  left = '10px';
  top = '10px';
}

আমি অনুমান করি এটি আপনার নির্ভরযোগ্যতা বা প্রকাশের পক্ষে পছন্দ করে কিনা তা নির্ভর করে।

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

আমি কল্পনা করেছি যে জাভা বা সি # পছন্দ করেন তারা প্রথম উপায়টি বেছে নেবেন (অবজেক্ট.মাইবার) এবং যারা রুবি বা পাইথন পছন্দ করেন তারা পরবর্তীকর্মটি বেছে নেবেন।


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

6

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

(with-slots (foo bar) objectname
   "some code that accesses foo and bar"

যা লেখার মতোই

"some code that accesses (slot-value objectname 'foo) and (slot-value objectname 'bar)""

এটি আপনার স্পষ্টতই কেন শর্টকাট হয় যখন আপনার ভাষা "অবজেক্টনাম.ফু" অনুমতি দেয় তবে এখনও।


1
লিস্প কোড দেখতে দুর্দান্ত! আমি মনে করি জাভাস্ক্রিপ্টে "সহ" স্পষ্টতই এটি একটি ভাষা হিসাবে এর স্কিম শিকড় দ্বারা অনুপ্রাণিত হয়েছে, তবে হায় আফসোস জাভাস্ক্রিপ্টের প্রশ্নে এলআইএসপি পোস্ট করার জন্য আপনি বঞ্চিত হচ্ছেন।
ফায়ার ক্র

1
বুনিয়াদি নীতিমালার উপর জোর দেওয়া। 'উইথ' একটি আশ্চর্যজনকভাবে শক্তিশালী নির্মাণ ruct তবে বেশিরভাগ জেএস লোকেরা ক্লোজারগুলি বুঝতে পারে না, এবং জেএসের শীর্ষে হাস্যকর জটিল জাভা শ্রেণীর উত্তরাধিকার ব্যবস্থা লিখেন - তবে তারা কীভাবে অফারগুলির সাথে 'বিপজ্জনক সম্ভাবনা সম্পর্কে সচেতন হতে পারে?
jared

অবশ্যই with-slotsআপনি কোন স্লটগুলি ব্যবহার করছেন তা নির্দিষ্ট করে তোলা দরকার, যেখানে withরানটাইমের সময় আবদ্ধ হওয়া স্লটগুলি যা ব্যবহার করবে তা ব্যবহার করবে।
স্যামুয়েল এডউইন ওয়ার্ড

6

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

Scoping সমস্যার তোমাদের উদার ব্যবহারের সঙ্গে মধ্যে পেতে পারেন সঙ্গে বিবৃতি একটি মধ্যে একটি রাজকীয় ব্যথা হতে পারে ** এবং আমি কাউকে জিনিসটা ডিবাগিং সেশন অনুভব করতে চাইবেন না তিনি কি .. আপনার কোড চলছে , কেবল এটি অনুসন্ধান করার জন্য এটি আপনার বিশ্বব্যাপী বা বাহ্যিক স্কোপ ভেরিয়েবলের পরিবর্তে কোনও অবজেক্ট সদস্য বা ভুল স্থানীয় পরিবর্তনশীলকে ক্যাপচার করেছে।

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


5
বিবৃতি সহ জাভাস্ক্রিপ্ট ডেলিফির চেয়ে খারাপ। ডেলফিতে, অবজেক্ট.মায়ার নোটেশনের চেয়ে ঠিক দ্রুত (দ্রুত না হলে) পারফর্ম করে। জাভাস্ক্রিপ্টে, মিলে যাওয়া সদস্যদের পরীক্ষা করার জন্য স্কোপটি হাঁটাতে হবে, সুতরাং এটি সর্বদা অবজেক্টের চেয়ে কম ধীরে তৈরি করে mber
মার্টিজন

5

এর সাথে ব্যবহারের প্রস্তাব দেওয়া হয় না এবং এটি ECMAScript 5 কঠোর মোডে নিষিদ্ধ। প্রস্তাবিত বিকল্প হ'ল সেই বস্তুটি বরাদ্দ করা যার বৈশিষ্ট্যগুলি আপনি অস্থায়ী পরিবর্তনশীল অ্যাক্সেস করতে চান।

সূত্র: মোজিলা.অর্গ


4

বিবৃতি সহ কোডটি আকার বা ব্যক্তিগত শ্রেণীর সদস্যদের হ্রাস করতে ব্যবহৃত হতে পারে, উদাহরণস্বরূপ:

// demo class framework
var Class= function(name, o) {
   var c=function(){};
   if( o.hasOwnProperty("constructor") ) {
       c= o.constructor;
   }
   delete o["constructor"];
   delete o["prototype"];
   c.prototype= {};
   for( var k in o ) c.prototype[k]= o[k];
   c.scope= Class.scope;
   c.scope.Class= c;
   c.Name= name;
   return c;
}
Class.newScope= function() {
    Class.scope= {};
    Class.scope.Scope= Class.scope;
    return Class.scope;
}

// create a new class
with( Class.newScope() ) {
   window.Foo= Class("Foo",{
      test: function() {
          alert( Class.Name );
      }
   });
}
(new Foo()).test();

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

আমি প্রায়শই যে খারাপ পারফরম্যান্সটি পড়ে থাকি সে সম্পর্কে: কোনও ফাংশন স্কোপ করাতে পারফরম্যান্সে কোনও প্রভাব পড়বে না, আসলে আমার এফএফ-তে একটি স্কোপড ফাংশন দ্রুত চলে তখন একটি অনির্বাচিত:

var o={x: 5},r, fnRAW= function(a,b){ return a*b; }, fnScoped, s, e, i;
with( o ) {
    fnScoped= function(a,b){ return a*b; };
}

s= Date.now();
r= 0;
for( i=0; i < 1000000; i++ ) {
    r+= fnRAW(i,i);
}
e= Date.now();
console.log( (e-s)+"ms" );

s= Date.now();
r= 0;
for( i=0; i < 1000000; i++ ) {
    r+= fnScoped(i,i);
}
e= Date.now();
console.log( (e-s)+"ms" );

সুতরাং উল্লিখিত উপায়ে উইথ-স্টেটমেন্টটি ব্যবহারের পারফরম্যান্সে কোনও নেতিবাচক প্রভাব ফেলবে না, তবে কোডের আকারটি হ্রাসকারী একটি ভাল কারণ এটি মোবাইল ডিভাইসে মেমরির ব্যবহারকে প্রভাবিত করে।


3

এর সাহায্যে ব্যবহার করা আপনার কোডকে অনেকগুলি প্রয়োগে ধীর করে তোলে, কারণ এখন সমস্ত কিছু দেখার জন্য অতিরিক্ত সুযোগে আবৃত। জাভাস্ক্রিপ্টে ব্যবহার করার কোনও বৈধ কারণ নেই।


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

2
আপনি ব্যতীত অন্য বিকাশকারীদের জন্য কোনও সমস্যা নাও হতে পারে তার ভিত্তিতে আমি আপনার সিদ্ধান্তের সাথে দৃ strongly়ভাবে একমত নই।
ডেভ ভ্যান ডেন এয়েণ্ডে

4
@ এম কে: ঠিক আছে, এখানে আপনার জন্য ক্রাঙ্কিং সংখ্যা: var obj={a:0,b:0,c:0};var d=+new Date;with(obj){for(var i=0;i<1000000;++i){a+=1;b+=1;c+=1}}+new Date-d;গড়ে 2500 var obj={a:0,b:0,c:0};var d=+new Date;for(var i=0;i<1000000;++i){obj.a+=1;obj.b+=1;obj.c+=1}+new Date-d;দেয় , যখন গড়ে 750 দেয় , যখন এটি 3 বারের চেয়ে বেশি ধীরে ধীরে ব্যবহার করে তৈরি করে।
ইয়োরিক

3
আমি যখন এটি দেখেছি তখন কনসোলে ক্রোম 23 এ কেবল এটি চালানো হয়েছিল। withকোডের জন্য আমি পেয়েছি ফলাফল 1138 এবং বিনা 903। এই ক্ষুদ্র পার্থক্যের সাথে এমনকি একটি শক্ত লুপে আমি পারফরম্যান্স সম্পর্কে চিন্তিত হওয়ার আগে কেডিংয়ের সরলতা এবং কেস-বাই-কেস ভিত্তিতে রিফ্যাক্টরিংয়ের সহজতার উপর ভিত্তি করে একটি নির্বাচন করব।
প্লাইঙ্কস

3

আমি মনে করি যে কোনও টেম্পলেট ভাষাটিকে জাভাস্ক্রিপ্টে রূপান্তর করার সাথে সাথে বিবৃতিটি কার্যকর হতে পারে। উদাহরণস্বরূপ JST মধ্যে base2 , কিন্তু আমি আরো প্রায়ই এটা দেখেছি।

আমি সম্মতি জানাই যে কেউ স্টেটমেন্ট ছাড়াই এটি প্রোগ্রাম করতে পারে। তবে এটি কোনও সমস্যা দেয় না কারণ এটি একটি বৈধ ব্যবহার।


3

অপেক্ষাকৃত জটিল পরিবেশে চালিত কোডটি কনটেইনারে রাখার পক্ষে এটি ভাল: আমি এটি "উইন্ডো" এর জন্য স্থানীয় বাঁধাই করতে এবং ওয়েব ব্রাউজারের জন্য বোঝায় এমন কোড চালানোর জন্য ব্যবহার করি।


3

আমি মনে করি অবজেক্টের আক্ষরিক ব্যবহার আকর্ষণীয়, যেমন ক্লোজার ব্যবহারের জন্য ড্রপ-ইন প্রতিস্থাপনের মতো

for(var i = nodes.length; i--;)
{
       // info is namespaced in a closure the click handler can access!
       (function(info)
       {           
            nodes[i].onclick = function(){ showStuff(info) };
       })(data[i]);
}

বা বন্ধের সমতুল্য বিবৃতি সহ

for(var i = nodes.length; i--;)
{
       // info is namespaced in a closure the click handler can access!
       with({info: data[i]})
       {           
            nodes[i].onclick = function(){ showStuff(info) };
       }        
}

আমি মনে করি যে আসল ঝুঁকিটি দুর্ঘটনাক্রমে ভেরিয়েবলগুলি নকল করা হয় যা বিবৃতি সহ অংশের নয়, কারণ কেন আমি পছন্দ করি যে বস্তুটির সাথে আক্ষরিক সাথে প্রেরণ করা যেতে পারে, আপনি কোডের সংযুক্ত প্রসঙ্গে এটি ঠিক কী দেখতে পাবেন তা দেখতে পাবেন।


3

আমি একটি "মার্জ" ফাংশন তৈরি করেছি যা withবিবৃতি দিয়ে এই কিছু অস্পষ্টতা দূর করে :

if (typeof Object.merge !== 'function') {
    Object.merge = function (o1, o2) { // Function to merge all of the properties from one object into another
        for(var i in o2) { o1[i] = o2[i]; }
        return o1;
    };
}

আমি এটির সাথে একইভাবে ব্যবহার করতে পারি withতবে আমি জানতে পারি এটি প্রভাব ফেলতে চাইলে এটি এমন কোনও সুযোগকে প্রভাবিত করবে না।

ব্যবহার:

var eDiv = document.createElement("div");
var eHeader = Object.merge(eDiv.cloneNode(false), {className: "header", onclick: function(){ alert("Click!"); }});
function NewObj() {
    Object.merge(this, {size: 4096, initDate: new Date()});
}

3

কিছু শর্ট কোড টুকরা জন্য, আমি মত ত্রিকোণমিতিক ফাংশন ব্যবহার করতে চান সেটি sin, cosডিগ্রী মোডে পরিবর্তে প্রভাশালী মোডে ইত্যাদি। এই উদ্দেশ্যে, আমি একটি AngularDegreeঅবজেক্ট ব্যবহার করি :

AngularDegree = new function() {
this.CONV = Math.PI / 180;
this.sin = function(x) { return Math.sin( x * this.CONV ) };
this.cos = function(x) { return Math.cos( x * this.CONV ) };
this.tan = function(x) { return Math.tan( x * this.CONV ) };
this.asin = function(x) { return Math.asin( x ) / this.CONV };
this.acos = function(x) { return Math.acos( x ) / this.CONV };
this.atan = function(x) { return Math.atan( x ) / this.CONV };
this.atan2 = function(x,y) { return Math.atan2(x,y) / this.CONV };
};

তারপরে আমি কোনও withব্লকে আরও ভাষার শব্দ ছাড়াই ডিগ্রি মোডে ত্রিকোণমিত্রিক ফাংশনগুলি ব্যবহার করতে পারি :

function getAzimut(pol,pos) {
  ...
  var d = pos.lon - pol.lon;
  with(AngularDegree) {
    var z = atan2( sin(d), cos(pol.lat)*tan(pos.lat) - sin(pol.lat)*cos(d) );
    return z;
    }
  }

এর অর্থ: আমি কোনও অবধি ফাংশনগুলির সংগ্রহ হিসাবে ব্যবহার করি যা আমি সীমিত কোড অঞ্চলে সরাসরি অ্যাক্সেসের জন্য সক্ষম করি। আমি এটি দরকারী মনে করি।


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

স্কোপিং সমস্যা সম্পর্কে সচেতন হয়েও আমি এখনও এটি দরকারী বলে মনে করি। কোডটি পড়ছেন এমন একজন গণিতবিদ সরাসরি দেখতে চান যে উপরের সূত্রটি গোলাকার ত্রিকোণমিতিতে "4 ধারাবাহিক অংশগুলির আইন" এর প্রয়োগ। কঠোর বিকল্প সূত্রটি অচল করে দেয়: z = Math.atan2( Math.sin(d * Math.PI / 180), Math.cos( pol.lat * Math.PI / 180) * Math.tan( pos.lat * Math.PI / 180 ) - Math.sin( pol.lat * Math.PI / 180 ) * Math.cos( d * Math.PI / 180) ) * 180 / Math.PI;একই ফলাফল দেবে, তবে এটি ভয়াবহ।
rplantiko

@rplantiko মনে রাখা বিষয়টি হল বেশিরভাগ লোকেরা এতে স্বাচ্ছন্দ্য বোধ করেন না। সুতরাং আপনি যদি এমন কোনও কোড লিখছেন যা অন্য কেউ কখনও স্পর্শ করবে না। এছাড়াও, আমি নিশ্চিত যে আমি আপনাকে তার বেশ কয়েকটি ব্যবহার দেখিয়ে withদিতে পারি st
হুয়ান মেন্ডেস

2

আমি মনে করি যে withআপনার কোডটি কতটা ভাল লেখা আছে তার উপর নির্ভরযোগ্যতা হতে পারে। উদাহরণস্বরূপ, আপনি যদি কোডটি লিখতে থাকেন যা এরকম প্রদর্শিত হয়:

var sHeader = object.data.header.toString();
var sContent = object.data.content.toString();
var sFooter = object.data.footer.toString();

তারপরে আপনি যুক্তি দিতে পারেন যে withএটি করে কোডের পঠনযোগ্যতা উন্নত করবে:

var sHeader = null, sContent = null, sFooter = null;
with(object.data) {
    sHeader = header.toString();
    sContent = content.toString();
    sFooter = content.toString();
}

বিপরীতে, এটি যুক্তিযুক্ত হতে পারে যে আপনি ডেমিটারের আইন লঙ্ঘন করছেন , তবে, আবারও, সম্ভবত না not আমি digress =)।

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


প্রতিক্রিয়া জন্য ধন্যবাদ, টম। আমি ক্রকফোর্ডের সুপারিশটি পড়েছি এবং এটি যখন বোঝায় তখন এটি কেবল এতদূর যায়। আমি এই ধারণাটি ঘুরে দেখছি - ডোকম্যান দ্বারা পরোক্ষভাবে স্পর্শ পেয়েছি - যে scope with এর সাথে আসল শক্তি যেভাবে এটি সুযোগকে
সামলানোর

2

আমি কেবল সত্যই দেখতে পাচ্ছি না যে কীভাবে কেবল ওজেট.মেমবার টাইপ করার চেয়ে আরও বেশি পঠনযোগ্য। আমি মনে করি এটি কোনও কম পাঠযোগ্য, তবে আমি মনে করি না এটি আর কোনও পাঠযোগ্য read

যেমনটি লাসেভেক বলেছেন, আমি অবশ্যই দেখতে পাচ্ছি যে কীভাবে ব্যবহার করা ঠিক তত স্পষ্ট "অবজেক্ট.মেম্বার" সিনট্যাক্স ব্যবহার না করে আরও ত্রুটি প্রবণ হবে।


1

আপনি ডাব্লু 3 স্কুলগুলিতে জাভাস্ক্রিপ্টে একটি ফর্মের বৈধতা দেখতে পেয়েছেন http://www.w3schools.com / js / js_form_ediaation.asp যেখানে 'ইমেইল' নামের নামের সাথে একটি ইনপুট সন্ধানের জন্য অবজেক্ট ফর্মটি "স্ক্যান" করা হয়েছে

তবে কোনও ফর্মের ক্ষেত্রের নাম বা পরিমাণ নির্বিশেষে, কোনও ক্ষেত্র খালি নয় বলে যাচাই করার জন্য আমি কোনও ফর্মের থেকে এটি পরিবর্তন করেছি। ভাল আমি কেবল পাঠ্য ক্ষেত্র পরীক্ষা করেছি।

তবে () দিয়ে জিনিসগুলি সহজতর করা হয়েছে। কোডটি এখানে:

function validate_required(field)
{
with (field)
  {
  if (value==null||value=="")
    {
    alert('All fields are mandtory');return false;
    }
  else
    {
    return true;
    }
  }
}

function validate_form(thisform)
{
with (thisform)
  {
    for(fiie in elements){
        if (validate_required(elements[fiie])==false){
            elements[fiie].focus();
            elements[fiie].style.border='1px solid red';
            return false;
        } else {elements[fiie].style.border='1px solid #7F9DB9';}
    }

  }
  return false;
}

1

কফিস্ক্রিপ্টের কোকো কাঁটাচামচটির একটি withকীওয়ার্ড রয়েছে তবে এটি কেবল ব্লকের মধ্যে লক্ষ্যযুক্ত বস্তুতে this( @কফিস্ক্রিপ্ট / কোকো হিসাবে লেখার মতো ) সেট করে। এটি অস্পষ্টতা দূর করে এবং ES5 কঠোর মোডের সম্মতি অর্জন করে:

with long.object.reference
  @a = 'foo'
  bar = @b

0

এখানে ভাল ব্যবহারের জন্য with: সেই বস্তুতে সঞ্চিত মানের উপর ভিত্তি করে কোনও অবজেক্ট লিটারালতে নতুন উপাদান যুক্ত করা। এখানে একটি উদাহরণ যা আমি সবেমাত্র ব্যবহার করেছি:

আমার কাছে সম্ভাব্য টাইলগুলির একটি সেট ছিল (উপরে, নীচের দিকে, বামে বা ডান দিকে মুখ খোলা রেখে) ব্যবহার করা যেতে পারে এবং আমি টাইলগুলির একটি তালিকা যুক্ত করার দ্রুত উপায় চেয়েছিলাম যা খেলার শুরুতে সর্বদা স্থাপন করা এবং লক করা হত I । আমি types.tbrতালিকায় প্রতিটি প্রকারের জন্য টাইপিং রাখতে চাইনি , তাই আমি সবেমাত্র ব্যবহার করেছি with

Tile.types = (function(t,l,b,r) {
  function j(a) { return a.join(' '); }
  // all possible types
  var types = { 
    br:  j(  [b,r]),
    lbr: j([l,b,r]),
    lb:  j([l,b]  ),  
    tbr: j([t,b,r]),
    tbl: j([t,b,l]),
    tlr: j([t,l,r]),
    tr:  j([t,r]  ),  
    tl:  j([t,l]  ),  
    locked: []
  };  
  // store starting (base/locked) tiles in types.locked
  with( types ) { locked = [ 
    br,  lbr, lbr, lb, 
    tbr, tbr, lbr, tbl,
    tbr, tlr, tbl, tbl,
    tr,  tlr, tlr, tl
  ] } 
  return types;
})("top","left","bottom","right");

0

আপনি প্রয়োজন.js ব্যবহার করার সময় স্পষ্টভাবে শালীনতা পরিচালনা করতে এড়াতে এর সাথে ব্যবহার করতে পারেন:

var modules = requirejs.declare([{
    'App' : 'app/app'
}]);

require(modules.paths(), function() { with (modules.resolve(arguments)) {
    App.run();
}});

প্রয়োজনীয়তা js.declare বাস্তবায়ন:

requirejs.declare = function(dependencyPairs) {
    var pair;
    var dependencyKeys = [];
    var dependencyValues = [];

    for (var i=0, n=dependencyPairs.length; i<n; i++) {
        pair = dependencyPairs[i];
        for (var key in dependencyPairs[i]) {
            dependencyKeys.push(key);
            dependencyValues.push(pair[key]);
            break;
        }
    };

    return {
        paths : function() {
            return dependencyValues;
        },

        resolve : function(args) {
            var modules = {};
            for (var i=0, n=args.length; i<n; i++) {
                modules[dependencyKeys[i]] = args[i];
            }
            return modules;
        }
    }   
}

0

অ্যান্ডি ই যেমন শোগ 9 এর উত্তরের মন্তব্যে ইঙ্গিত করেছেন, withকোনও বস্তু সহ আক্ষরিক ব্যবহার করার সময় এই সম্ভাব্য-অপ্রত্যাশিত আচরণ ঘটে :

for (var i = 0; i < 3; i++) {
  function toString() {
    return 'a';
  }
  with ({num: i}) {
    setTimeout(function() { console.log(num); }, 10);
    console.log(toString()); // prints "[object Object]"
  }
}

অপ্রত্যাশিত আচরণটি ইতিমধ্যে একটি পরিচয় ছিল নাwith

আপনি যদি এখনও এই কৌশলটি ব্যবহার করতে চান তবে কমপক্ষে নাল প্রোটোটাইপযুক্ত কোনও বস্তু ব্যবহার করুন।

function scope(o) {
  var ret = Object.create(null);
  if (typeof o !== 'object') return ret;
  Object.keys(o).forEach(function (key) {
    ret[key] = o[key];
  });
  return ret;
}

for (var i = 0; i < 3; i++) {
  function toString() {
    return 'a';
  }
  with (scope({num: i})) {
    setTimeout(function() { console.log(num); }, 10);
    console.log(toString()); // prints "a"
  }
}

তবে এটি কেবল ES5 + এ কাজ করবে। এছাড়াও ব্যবহার করবেন না with


0

আমি এমন একটি প্রকল্পে কাজ করছি যা ব্যবহারকারীদের অ্যাপ্লিকেশনটির অংশগুলির আচরণ পরিবর্তন করতে কোড আপলোড করার অনুমতি দেবে। এই দৃশ্যে, আমি withতাদের কোডটি যে পরিমাণে ফাঁকি দিতে চাই তার বাইরে এমন কিছু পরিবর্তন না করাতে তাদের একটি ক্লজ ব্যবহার করছি। আমি এটি করতে কোডটির (সরলীকৃত) অংশটি ব্যবহার করি:

// this code is only executed once
var localScope = {
    build: undefined,

    // this is where all of the values I want to hide go; the list is rather long
    window: undefined,
    console: undefined,
    ...
};
with(localScope) {
    build = function(userCode) {
        eval('var builtFunction = function(options) {' + userCode + '}');
        return builtFunction;
    }
}
var build = localScope.build;
delete localScope.build;

// this is how I use the build method
var userCode = 'return "Hello, World!";';
var userFunction = build(userCode);

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

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

test = function() {
     return this.window
};
return test();

সংশ্লিষ্ট: stackoverflow.com/questions/543533/...
Shog9

0

আমার

switch(e.type) {
    case gapi.drive.realtime.ErrorType.TOKEN_REFRESH_REQUIRED: blah
    case gapi.drive.realtime.ErrorType.CLIENT_ERROR: blah
    case gapi.drive.realtime.ErrorType.NOT_FOUND: blah
}

সারবস্তুটা হচ্ছে

with(gapi.drive.realtime.ErrorType) {switch(e.type) {
    case TOKEN_REFRESH_REQUIRED: blah
    case CLIENT_ERROR: blah
    case NOT_FOUND: blah
}}

আপনি কি এত নিম্ন মানের কোড বিশ্বাস করতে পারেন? না, আমরা দেখতে পাচ্ছি যে এটি একেবারে অপঠনযোগ্য হয়ে উঠেছে। এই উদাহরণটি অনস্বীকার্যভাবে প্রমাণ করে যে বিবৃতি সহ কোনও প্রয়োজন নেই, যদি আমি পড়ার যোগ্যতা সঠিকভাবে গ্রহণ করি;)

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