জাভাস্ক্রিপ্ট ভেরিয়েবলগুলি লুপের বাইরে বা অভ্যন্তরে ঘোষণা করে?


213

এএস 3-তে আমি বিশ্বাস করি বর্ধিত পারফরম্যান্সের জন্য আপনার লুপের বাহিরে সমস্ত পরিবর্তনশীল সূচনা করা উচিত। এটি কি জাভাস্ক্রিপ্টের ক্ষেত্রেও আছে? কোনটি আরও ভাল / দ্রুত / সেরা-অনুশীলন?

var value = 0;

for (var i = 0; i < 100; i++)
{
    value = somearray[i];
}

অথবা

for (var i = 0 ; i < 100; i++)
{
    var value = somearray[i];
}

7
বাইরে! সর্বদা বাইরে।
বিজিরিসসেন

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

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

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

3
আমি অবাক হয়েছি কেউ পারফরম্যান্স মাপার চেষ্টা করেনি। আমি একটি জাসস্পারফ তৈরি করেছি । ক্রোমের বিপরীতে সাফারি এবং ফায়ারফক্সের লুপের ভিতরে ঘোষণার সময় কিছুটা দ্রুত বলে মনে হচ্ছে ...
বুজুত

উত্তর:


281

নেই একেবারে কোন পার্থক্য অর্থ বা কর্মক্ষমতা, জাভাস্ক্রিপ্ট বা ActionScript হবে।

varপার্সারের পক্ষে নির্দেশনা, এবং রান-টাইমে কার্যকর আদেশ নয় command যদি কোনও নির্দিষ্ট শনাক্তকারী varকোনও ফাংশন বডি (*) এ এক বা একাধিক জায়গায় ঘোষিত হয়ে থাকে , তবে ব্লকের সেই শনাক্তকারীর সমস্ত ব্যবহার স্থানীয় ভেরিয়েবলের উল্লেখ করবে। লুপের বাইরে, লুপের বাইরে বা উভয় valueহিসাবে ঘোষিত হয় কিনা তা কোনও তাত্পর্যপূর্ণ করে না var

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

নির্দিষ্টভাবে:

for (var i; i<100; i++)
    do something;

for (var i; i<100; i++)
    do something else;

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

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

(*: নেস্টেড ফাংশন বডি ব্যতীত)


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

20
+1 আমি ক্রকফোর্ডের যুক্তি (ড্যানিয়েলের উত্তরে উদ্ধৃত) সাথে একমত নই, জাভাস্ক্রিপ্ট বিকাশকারী হিসাবে আমাদের কোড লেখা উচিত নয় যাতে অন্যান্য "সি পরিবার" প্রোগ্রামাররা এটি বুঝতে পারে। আমি প্রায়ই ব্যবহার Var ভিতরে যদি ব্লক এবং loops কারণ এটি আমার আরো জ্ঞান করে তোলে।
অ্যান্ডি ই

4
-1 ওপি জিজ্ঞাসা করছে লুপটি শুরুর আগে লুপের শরীরে ভার্সগুলি ঘোষিত করা উচিত কিনা। লুপের সূচক মান স্পষ্টতই একটি বিশেষ কেস (এবং উত্তোলন করা হয়) এবং ওপিকে মোটেই সহায়তা করে না।
mkoistinen

21
লুপ সূচকগুলি কোনও বিশেষ ক্ষেত্রে নয়, এগুলি হ্যান্ডেল করা হয় এবং সাধারণ কার্যভারের ঠিক ঠিক একই ভাবে উত্তোলন করা হয়।
বোবিনস

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

64

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

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

জাভাস্ক্রিপ্টের ব্লকের সুযোগ নেই, সুতরাং ব্লকগুলিতে ভেরিয়েবলগুলি সংজ্ঞায়িত করা প্রোগ্রামারগুলিকে বিভ্রান্ত করতে পারে যারা অন্যান্য সি পারিবারিক ভাষার সাথে অভিজ্ঞ। ফাংশনের শীর্ষে সমস্ত ভেরিয়েবল সংজ্ঞায়িত করুন।

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

function myFunction() {
  var i;    // the scope of the variables is very clear

  for (i = 0; i < 10; i++) {
    // ...
  }
}

8
জেএস সুযোগ সম্পর্কে ওপি সত্য বলতে +1 + আমি ভাবছি যে উত্তরগুলি অন্যথায় বলাকে কমিয়ে দেবে কিনা!
ব্যয়কারী

1
@ কিয়েরানমাইন: আমি বলিনি এটির প্রভাব প্রভাবিত করে না। আমি কেবল এগুলি লুপের বাইরে রাখার পক্ষে যুক্তি দিয়েছিলাম, পারফরমেন্সের অপ্রাসঙ্গিক .... পারফরম্যান্সের যুক্তিগুলির জন্য আমার কাছে কোনও রেফারেন্স নেই, তবে আপনি আপনার উত্তরে কোনও উল্লেখ করেননি :)
ড্যানিয়েল ভ্যাসালো

1
@ কিরেমনাইন: আপনি কি এর জন্য একটি উত্স আছে?
অ্যান্ডি ই

5
@ কিরানমাইন: এএফাইক এমনকি আপনি যদি একটি লুপের ভিতরে ভেরিয়েবলগুলি ঘোষণা করেন, রানটাইমগুলিতে এগুলি ধাক্কা খাবে ecma- / javascript। একে বলা হয় "উত্তোলন"। সুতরাং কোনও পার্থক্য থাকা উচিত নয়।
jAndy

1
ES6 এর letউত্তরটি কীভাবে প্রভাবিত করে?
jbyrd

58

ECMA-/Javascriptভাষা hoistsকোনো পরিবর্তনশীল যা একটি ফাংশন শীর্ষে যে কোন জায়গায় ঘোষিত হয়। এটা এ কারণে যে এই ভাষা নেই আছে function scopeএবং নেই না আছে block scopeঅনেক অন্যান্য ভাষায় সি-মতো।
এটি হিসাবে পরিচিত lexical scope

এমন কিছু ঘোষণা দিলে

var foo = function(){
    for(var i = 0; i < 10; i++){
    }
};

এটি এটি পায় hoisted:

var foo = function(){
    var i;
    for(i = 0; i < 10; i++){
    }
}

সুতরাং এটি পারফরম্যান্সে কোনও পার্থক্য করে না (তবে আমি এখানে পুরোপুরি ভুল হলে আমাকে সংশোধন করুন)। কোনও ফাংশনের শীর্ষের চেয়ে অন্য কোথাও ভেরিয়েবল ঘোষণা না করার
পক্ষে আরও ভাল যুক্তি হ'ল পাঠযোগ্যতা । একটি ভেরিয়েবলের ঘোষণা দিয়ে ভুল ধারণা হতে পারে যে এই ভেরিয়েবলটি কেবল লুপের দেহে প্রবেশ করা যায় যা সম্পূর্ণ ভুল । প্রকৃতপক্ষে আপনি বর্তমান স্কোপের মধ্যে যে কোনও পরিবর্তনশীল অ্যাক্সেস করতে পারবেন।for-loop


স্বীকৃত উত্তর হিসাবে একই বুনিয়াদী উত্তর, আইএমও, আরও পঠনযোগ্য এবং প্রায় তথ্যবহুল। চমৎকার কাজ.
অ্যান গান

5
ES6 এর letউত্তরটি কীভাবে প্রভাবিত করে?
jbyrd

13

পরের বছর, সমস্ত ব্রাউজারে জেএস ইঞ্জিন থাকবে যা কোডটিকে পূর্বনির্মাণ করে যাতে পারফরম্যান্সের পার্থক্য (যা আবার একই কোডের ব্লকটি বারে বারে পাঠানোর সাথে সাথে অ্যাসাইনমেন্টটি কার্যকর করে) নগণ্য হয়ে ওঠে।

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


6

আরেকটি বিবেচনা, এখন আমাদের letএবং constES2015 এ, আপনি এখন লুপ ব্লকে বিশেষত স্কোপ ভেরিয়েবলগুলি করতে পারেন। সুতরাং যদি না আপনার লুপের বাইরে একই চলকটির প্রয়োজন হয় (বা যদি প্রতিটি পুনরাবৃত্তি পূর্ববর্তী পুনরাবৃত্তির ক্ষেত্রে চলকটির সাথে করা কোনও ক্রিয়াকলাপের উপর নির্ভর করে), তবে সম্ভবত এটি করা ভাল fe

for (let i = 0; i < 100; i++) {
    let value = somearray[i];
    //do something with `value`
}

4

আমি সবেমাত্র ক্রোমে একটি সাধারণ পরীক্ষা করেছি। আপনার ব্রাউজারে ঝাঁকুনির চেষ্টা করে দেখুন ফলাফলগুলি

  var count = 100000000;
    var a = 0;
    console.log(new Date());

    for (var i=0; i<count; i++) {
      a = a + 1
    }

    console.log(new Date());

    var j;
    for (j=0; j<count; j++) {
      a = a + 1;
    }

    console.log(new Date());

    var j;
    for (j=0; j<count; j++) {
        var x;
        x = x + 1;
    }

    console.log(new Date());

ফলাফলটি হ'ল সর্বশেষ পরীক্ষায় ~ 8 সেকেন্ড সময় লাগে এবং পূর্ববর্তী 2টি হয় মাত্র 2 সেকেন্ড। খুব পুনরাবৃত্তি এবং আদেশ নির্বিশেষে।

সুতরাং, এটি আমার কাছে প্রমাণিত হয় যে সর্বদা লুপের বাইরের অংশগুলি ঘোষণা করা উচিত। আমার কাছে কৌতুহলপূর্ণ মামলাটি প্রথম যেখানে আমি i() বিবৃতিতে ঘোষণা করি । এটি প্রথম টেস্টের মতোই দ্রুত বলে মনে হচ্ছে যেখানে আমি সূচিটি প্রাক-ঘোষণা দিয়েছি।


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

1
@AndyE। বাহ, এই সাধারণ পরীক্ষার উপর ভিত্তি করে, IE আরও 100 এক্সকে চুষে ফেলে? =)
mkoistinen

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

4
সত্যের পরে এক বছরেরও বেশি পরে, তবে শাপ দিন
sdleihssirhc

2
এটি আমার নয়, তবে আমি অনুভব করেছি যে আপনার মধ্যে কিছু আগ্রহী: jsperf.com/var-in-for-loop
m1।

1

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


1
সি বা সি ++ জাভাস্ক্রিপ্টের নীচে থাকতে পারে। তবে আমাদের এটি ভুলে যাওয়া উচিত নয়, ব্রাউজার জাভাস্ক্রিপ্টকে অন্তর্নিহিত ভাষায় রূপান্তর করে (সি, সি ++)। সুতরাং কার্য সম্পাদন ব্রাউজারের উপর নির্ভর করে
কিরা

3
@ কীরা এটি আসলে সি / সি ++ তে রূপান্তরিত হয় না। জাভাস্ক্রিপ্ট নির্দেশাবলীর একটি সংকলন হয়ে যায় যা জেএস রানটাইম (যেমন ব্রাউজারে চলমান ভার্চুয়াল মেশিন) দ্বারা সম্পাদিত হয়। একই নীতিটি পাইথন এবং রুবির মতো অন্যান্য গতিশীল ভাষার ক্ষেত্রেও প্রযোজ্য।
অ্যান্টনি ই

@ অ্যান্থনি, তথ্যের জন্য ধন্যবাদ আমি জেএসকে সি বা সি ++ এ রূপান্তর করার বিষয়ে নিশ্চিত ছিলাম না। সুতরাং আমি আমার মন্তব্যে থাকতে পারি
কিরা

0

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


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

0

আপনি লুপের ভিতরে বা বাইরে ভেরিয়েবলগুলি ঘোষণা করলে কোনও পার্থক্য হবে না। নীচে পরীক্ষার জন্য নমুনা কোড দেওয়া আছে।

function a() {
   console.log('Function a() starts');
   console.log(new Date());
    var j;
    for (j=0; j<100000000; j++) {
        var x;
        x = x + 1;
    }
    console.log(new Date());
    console.log('Function a() Ends');
}
a()
function b() {
console.log('Function B() starts');
   console.log(new Date());
    var a;
    var j;
    for (j=0; j<100000000; j++) {
      a = a + 1;
    }
    console.log(new Date());
    console.log('Function B() Ends');
}
b()

ফলাফলগুলি আমার ক্ষেত্রে প্রদর্শিত হয়েছিল

Function a() starts
VM121:3 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:9 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:10 Function a() Ends
VM121:14 Function B() starts
VM121:15 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:21 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:22 Function B() Ends

আপনাকে ধন্যবাদ - MyFavs.in


উভয় ক্ষেত্রে আপনি লুপ বাইরে জে ঘোষণা! এক্স_এক্স
জন কেটেজিক

আমি ক্রোমিয়াম 81 এটা চেষ্টা সঙ্গে letপরিবর্তে varএবং a()একটি বিট ধীর হতে থাকে (120 বনাম 115 MS = ~ 6% = আইএমও তুচ্ছ মত)
mikiqex

-1

এখানে প্রশ্নটি মূলত একটি লুপের ভিতরে একটি ভ্যারিয়াল ঘোষণা করা। আপনি যদি এটি করেন তবে কি হবে তা ভেবে দেখুন:

var a = 30;
var a = 50;
var a = 60;

আপনি এই অধিকার কি মনে হয়? না ... কারণ আপনি এতদিন ভেরিয়েবল ঘোষণা করতে চান না। আপনি যখন কোনও লুপের ভিতরে ভেরিয়েবল ঘোষণা করেন এটি লুপটি চালানোর সময় হিসাবে ঘোষিত হয় না? স্পষ্টতই যখন আপনি 'কঠোর ব্যবহার' মোডে থাকবেন তখন আপনাকে চড় মারবে। মানুষ আসল প্রশ্নটি না ভেবে ক্রকফোর্ডের সাথে দ্বিমত পোষণ করেছে।

সুতরাং শীর্ষে ভেরিয়েবলগুলি ঘোষণা করা সর্বদা ভাল - 1. পাঠযোগ্যতার জন্য, ২. ভাল অভ্যাস তৈরি করা।


1
"আপনি যখন লুপের ভিতরে ভেরিয়েবল ঘোষণা করেন তখন এটি লুপটি চালানোর সময় হিসাবে ঘোষণা করে না?" <- না, এটা ঠিক নেই। ভেরিয়েবলের ঘোষণাটি উত্তোলন হয়ে যায়, সুতরাং আপনার সাথে যা কিছু বাকি রয়েছে তা হ'ল অ্যাসাইনমেন্ট।
ম্যাথিয়াস

-2

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

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

// inline
for (var ai = 0, al = 100000000, av; ai < al; ai++) {
    av = av + 1;
}

// outside
var bv;
var bl = 100000000;
for (var bi = 0; bi < bl; bi++) {
    bv = bv + 1;
}

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

https://jsperf.com/outside-inline-for-loop-ase/1


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

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