ভ্যার কীওয়ার্ডের উদ্দেশ্য কী এবং আমি কখন এটি ব্যবহার করব (বা এটি বাদ দিতে পারি)?


1543

দ্রষ্টব্য : ECMAScript সংস্করণ 3 বা 5 এর দৃষ্টিকোণ থেকে এই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল উত্তরগুলি ECMAScript 6 প্রকাশের ক্ষেত্রে নতুন বৈশিষ্ট্য প্রবর্তনের সাথে পুরানো হতে পারে।

varজাভাস্ক্রিপ্টে মূলশব্দটির কাজটি ঠিক কী এবং এর মধ্যে পার্থক্য কী

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

এবং

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

আপনি কখন একটি ব্যবহার করবেন এবং কেন / এটি কী করে?


3
ভ্যার ডিক্লেয়ারেশন শৃঙ্খলাবদ্ধ করার সময়, কমা পরে কোনও নিউলাইন লাগানো কি আচরণকে প্রভাবিত করে? var x = 1, y = 2, [ফিরে] z = 3;
আলফাব্রভো

4
"ভার" ব্যবহার করতে ব্যর্থ হওয়ার ফলে আপনি যে ভেরিয়েবলটির নামটি বেছে নিয়েছেন সেটি পূর্বনির্ধারিত বৈশ্বিক চলক হয়ে ওঠে তা আপনাকে উন্মুক্ত করে দেয়। আমার শোকের যাত্রাটি এখানে দেখুন: stackoverflow.com/questions/16704014/…
স্কট সি উইলসন

5
@Ray Toal এর meloncard ব্লগ পোস্ট (স্পষ্টভাবে মূল্য পঠিত) সরানো হয়েছে blog.safeshepherd.com/23/how-one-missing-var-ruined-our-launch
হেফাইস্তুস

আমি কখনই ভাবিনি যে কোনও কবিতা আমাকে প্রোগ্রামিক সমস্যার জন্য বিবেচনা করতে উদ্বুদ্ধ করতে পারে
ফ্যালিক্স গাগনন-গ্রেনিয়ার

1
@ গিবল্ট তবে প্রশ্নের তারিখটি দেখুন, এটি বলার জন্য এটি ২০০৯ সালের একটি প্রশ্ন একটি অন্যায় অন্যায় আহবান। যদিও এটি এখনও রক্ষণাবেক্ষণের জন্য বর্তমান তারিখের মতো বৈধ, সেখানে "আধুনিক জেএস" কোডের একটি গুচ্ছ নেই।
আন্দ্রে ফিগুয়েরিডো

উত্তর:


1355

আপনি যদি বিশ্বব্যাপী সুযোগে থাকেন তবে খুব বেশি পার্থক্য নেই। ব্যাখ্যার জন্য কঙ্গাক্সের উত্তর পড়ুন

আপনি যদি কোনও ফাংশনে থাকেন তবে varএকটি স্থানীয় ভেরিয়েবল তৈরি করবেন, যতক্ষণ না এটি ভেরিয়েবলটি সন্ধান করে বা গ্লোবাল স্কোপকে আঘাত করে না (যতক্ষণে এটি এটি তৈরি করবে) অবধি স্কোপ চেইনের সন্ধান করবে না "কোনও ভার্" না:

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

আপনি যদি কোনও অ্যাসাইনমেন্ট না করে থাকেন তবে আপনার ব্যবহারের প্রয়োজন var:

var x; // Declare x

31
"আসলেই খুব বেশি পার্থক্য নেই" == "কোনও পার্থক্য নেই"?
অ্যালেক্স

65
ঠিক আছে, আসলে হ্যাঁ, পার্থক্য আছে :) পার্থক্যটি গুরুত্বপূর্ণ কিনা তা অন্য একটি প্রশ্ন। : আরও নিচে আমার উত্তর দেখুন stackoverflow.com/questions/1470488/...
kangax

4
আমি মনে করি এটি অ্যালেক্সের পয়েন্ট হতে পারে, এ কারণেই তিনি "সমান সমান" অপারেটর ব্যবহার করে এটি লিখেছেন!
জেমস বেডফোর্ড

18
এটি নিজেকে রেলগান দিয়ে শুটিংয়ের মতো ... নিজের ভেরিয়েবলের আগে 'ভার' রাখার কথা ভুলে যান এবং স্কোপ চেইনে কোথাও কোনও ভেরিয়েবল পরিবর্তন করা ... জাভা / সি / পাইথন / ইত্যাদি বোঝানোর চেষ্টা করুন। বিকাশকারী জাভাস্ক্রিপ্ট সার্থক। হা! সি / সি ++ ক্ষতিগুলি বিপরীতে সুন্দর দেখায় by জাভাস্ক্রিপ্ট ডিবাগ করার কথা ভাবুন ... এবং কিছু লোক অবশ্যই তা করেন। এবং জাভাস্ক্রিপ্টে অনেকগুলি কোড (এবং সাধারণ কোড নয়, মনে রাখবেন) লেখা আছে ...
অ্যালবাস ডাম্বলডোর

6
আপনি যদি বিশ্বব্যাপী সুযোগে থাকেন তবে কোনও পার্থক্য নেই। >> একটি পার্থক্য রয়েছে যা নীচের উত্তরে ব্যাখ্যা করা হয়েছে
ম্যাক্স কোরেটস্কিই

746

একটি পার্থক্য আছে

var x = 1 xবর্তমান স্কোপে ভেরিয়েবল ঘোষণা করে (ওরফে এক্সিকিউশন কনটেক্সট)। যদি কোনও কার্যক্রমে ঘোষণাটি প্রকাশিত হয় - একটি স্থানীয় ভেরিয়েবল ঘোষণা করা হয়; যদি এটি বিশ্বব্যাপী সুযোগে থাকে - একটি বৈশ্বিক চলক ঘোষণা করা হয়।

x = 1অন্যদিকে, এটি কেবল একটি সম্পত্তি বরাদ্দ। এটি প্রথমে xস্কোপ চেইনের বিরুদ্ধে সমাধান করার চেষ্টা করে । যদি এটি স্কোপ চেইনে এটি কোথাও খুঁজে পাওয়া যায়, তবে এটি কার্য সম্পাদন করে; যদি এটি না খুঁজে পাওয়া যায় xতবে কেবলমাত্র এটি xবিশ্বব্যাপী কোনও সামগ্রীতে সম্পত্তি তৈরি করে (যা স্কোপ চেইনে শীর্ষ স্তরের একটি বিষয়)।

এখন লক্ষ্য করুন যে এটি বৈশ্বিক পরিবর্তনশীল ঘোষণা করে না, এটি একটি বিশ্বব্যাপী সম্পত্তি তৈরি করে।

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

যেহেতু ভেরিয়েবল ডিক্লেয়ারেশন ডন্টডিলিট পতাকা সহ সম্পত্তি তৈরি করে, var x = 1এবং x = 1(বৈশ্বিক স্কোপে কার্যকর করা হলে) এর মধ্যে পার্থক্যটি হ'ল প্রাক্তনটি - পরিবর্তনশীল ঘোষণা - ডন্টডিলিট'এল সম্পত্তি তৈরি করে, এবং পরবর্তীটি তা করে না। ফলস্বরূপ, এই অন্তর্নিহিত অ্যাসাইনমেন্টের মাধ্যমে তৈরি সম্পত্তি বিশ্বব্যাপী অবজেক্ট থেকে মুছে ফেলা যেতে পারে এবং পূর্বের এক - পরিবর্তনশীল ঘোষণার মাধ্যমে তৈরি করা - মুছা যায় না।

তবে এটি অবশ্যই তত্ত্ব, এবং বাস্তবে বাস্তবায়নের ক্ষেত্রে বিভিন্ন বাগের কারণে (যেমন আইআই থেকে প্রাপ্ত) দুজনের মধ্যে আরও বেশি পার্থক্য রয়েছে

আশা করি এটি সমস্ত অর্থবোধ করে:)


[আপডেট 2010/12/16]

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


আমি যদি সঠিকভাবে স্মরণ করি তবে আমার মনে হয় আমি একবার deleteকিছু evalহ্যাক দিয়ে ভ্যারিয়েল ঘোষিত ভেরিয়েবলকে সক্ষম করার উপায় খুঁজে পেয়েছি । আমি যদি সঠিক কৌশলটি মনে করি তবে আমি এখানে পোস্ট করব।
টাওয়ার

3
@ ম্যাজেক তিনি সম্ভবত ইওল-ডিক্লেড ভেরিয়েবলগুলি নিয়ে যাচ্ছেন যা ডিলেটযোগ্য। আমি এই সম্পর্কে একবার একটি ব্লগ পোস্ট লিখেছিলাম ।
কঙ্গাক্স

1
সামান্য কিছু বিষয় বাইরে, কিন্তু রেফারেন্সের জন্য এখানে উল্লেখ। "লেট" "ভার" এর সাথে খুব মিল এবং এটি মজিলায় সমর্থিত। মূল পার্থক্য হ'ল একটি ভেরিয়েবলের ব্যাপ্তিটি পুরো এনকোলেজিং ফাংশন যেখানে "লেট" হিসাবে এটির ব্লক সীমাবদ্ধ
ম্যাক

@ কঙ্গাক্স অ্যালেক্সের উদাহরণগুলির শেষ দুটি লাইন মিশ্রিত হলে: var someObject = {}এবং someObject.someProperty = 5? চান someProperty, গ্লোবাল হয়ে যখন বস্তুর এটা দেহাবশেষ একটি সম্পত্তি স্থানীয় কে?
স্ন্যাপফ্র্যাক্টলপপ

1
@ কংগ্যাক্স ডন্টডিলিট পতাকাটি যা বলে তার জন্য নির্দিষ্ট নামটি কনফিগারযোগ্য (= false) , আপনি এই সম্পর্কে পড়তে পারেন Object.definePropertyএবংObject.getOwnPropertyDescriptor
পল এস

137

এটি " স্থানীয় এবং বৈশ্বিক " এর মধ্যে পার্থক্যটি সম্পূর্ণ সঠিক নয় Say

এটি " স্থানীয় এবং নিকটতম " এর মধ্যে পার্থক্য হিসাবে মনে করা ভাল । নিকটতম অবশ্যই বিশ্বব্যাপী হতে পারে, তবে সবসময় এটি হবে না।

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}

3
outerআপনি সংজ্ঞায়িত নিকটতম সুযোগটি কি নয় var global = false;?
স্নেকসে

@ স্নেকস: <code> var গ্লোবাল = মিথ্যা </ em> ঘোষিত হলে 'নিকটতম' প্রযোজ্য নয়। সেই ঘোষণাপত্রে 'গ্লোবাল' বহিরাগত () এর স্কোপে স্থাপন করা হয় কারণ ঘোষণাপত্রে 'ভার' ব্যবহৃত হয়। কারণ 'ভার' অভ্যন্তরীণ () ব্যবহার করা হয় না, এটি পরবর্তী স্তরের মান পরিবর্তন করবে যা বাইরের ())
মিচ

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

80

জাভাস্ক্রিপ্ট যখন কোনও ব্রাউজারে কার্যকর করা হয়, তখন আপনার সমস্ত কোড একটি বিবৃতি দিয়ে ঘিরে থাকে, যেমন:

with (window) {
    //Your code
}

আরও তথ্য with- এমডিএন

যেহেতু বর্তমানvar স্কোপটিতে একটি ভেরিয়েবল ঘোষণা করে , তাই উইন্ডোর অভ্যন্তরে ঘোষণা করা এবং এটি একেবারে না ঘোষণার মধ্যে কোনও পার্থক্য নেই ।var

পার্থক্য তখনই আসে যখন আপনি সরাসরি উইন্ডোতে থাকেন না, যেমন কোনও ফাংশনের ভিতরে বা কোনও ব্লকের ভিতরে।

ব্যবহারের varসাহায্যে আপনাকে বহিরাগত ভেরিয়েবলগুলি একই নামযুক্ত গোপন করতে দেয়। এইভাবে আপনি একটি "ব্যক্তিগত" ভেরিয়েবল অনুকরণ করতে পারেন, তবে এটি অন্য একটি বিষয়।

থাম্ব একটি নিয়ম সর্বদা ব্যবহার করা হয় var, কারণ অন্যথায় আপনি সূক্ষ্ম বাগ প্রবর্তনের ঝুঁকি চালান।

সম্পাদনা: আমি যে সমালোচনা পেয়েছি তার পরে, আমি নিম্নলিখিতগুলিতে জোর দিতে চাই:

  • varবর্তমান সুযোগে একটি পরিবর্তনশীল ঘোষণা করে
  • বিশ্বব্যাপী সুযোগ window
  • গ্লোবাল স্কোপ (উইন্ডো) এ varস্পষ্টভাবে ডিক্লেয়ার ব্যবহার না করাvar
  • বৈশ্বিক স্কোপ (উইন্ডো) ব্যবহার করে ভেরিয়েবল ঘোষণা varকরা বাদ দেওয়া সমান।
  • উইন্ডো ব্যবহার করে স্কোপগুলিতে ভিন্ন একটি ভেরিয়েবল ঘোষণা করা ছাড়া চলক ঘোষণার মতো var জিনিস নয়var
  • সর্বদা varস্পষ্টভাবে ঘোষণা করুন কারণ এটি ভাল অনুশীলন

1
আমি আপনাকে হ্রাস করি নি, তবে স্কোপটি সম্ভবত উইন্ডোর চেয়ে ভাল শব্দ। আপনার পুরো ব্যাখ্যাটি কিছুটা বাধা।
রবার্ট হার্ভে

4
আমি কেবল নামগুলির সাথে জিনিসগুলি কল করি, আপনি এটি "বৈশ্বিক সুযোগ" বলতে চান, এটি ঠিক আছে, তবে ক্লায়েন্ট-সাইড, কনভেনশন অনুসারে, এটি উইন্ডো অবজেক্ট, এটিই স্কোপ চেইনের শেষ উপাদান, আপনি কেন প্রতিটি কল করতে পারেন? "উইন্ডো" না লিখে ফাংশন এবং উইন্ডোটির প্রতিটি বস্তু।
কেন্টারমিউড়া

2
+1 এটি একটি দুর্দান্ত ব্যাখ্যা - আমি এর আগে ভেরি / কোনও ভার ইস্যু ফ্রেম করা হয়নি (কোনও পাং উদ্দেশ্য নয়) শুনেছি।
ডগ

এই উত্তরটির বেশিরভাগটি letES6 এর সাথে অবচিত ।
ইভান ক্যারল

3
@ ইভ্যানক্যারল এই উত্তরটি প্রযুক্তিগতভাবেও ভুল, যেহেতু বাদ দেওয়া ভেরিয়েবল কোনও পরিবর্তনশীল ঘোষণা করে না, পরিবর্তে এটি বিশ্বব্যাপী একটি ডিলেটযোগ্য সম্পত্তি তৈরি করে, ES5 এর সাথে "কঠোরভাবে ব্যবহার করুন" মোডের সাথে বেশিরভাগ উত্তর সুস্পষ্টভাবে সঠিক নয়, এছাড়াও দেওয়া হয়নি ' এমনকি প্রশ্নের উত্তরে জাভাস্ক্রিপ্ট সংস্করণ (গতকাল যুক্ত হওয়া) সম্পর্কিত কোনও রেফারেন্স ছিল না বলে এই উত্তরেও বিবেচনা করা হয়নি যার দ্বারা বোঝা যায় যে রেফারেন্সের মান (সেই সময়) ECMA 262 তৃতীয় সংস্করণ ছিল।
কেন্টারমিউড়া

43

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

var কীওয়ার্ড ব্যতীত যে কোনও পরিবর্তনশীল তৈরি করা হয় তা বিশ্বব্যাপী তৈরি হয় এবং ফাংশনটি ফিরে আসার সময় আবর্জনা সংগ্রহ করা হয় না (কারণ এটি সুযোগের বাইরে যায় না), মেমরি ফাঁসের সুযোগ উপস্থাপন করে।


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

@ সিএইচওও আমার মনে good coding practiceহয় যদি এটি প্রস্তাবিত সেরা অনুশীলন হয় তবে এটি বেশ কয়েকটি জাভাস্ক্রিপ্ট লেখক দ্বারা সর্বদা যথেষ্ট কারণ।
ক্রিস এস

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

30

আপনি এখানে স্থানীয় ভেরিয়েবলগুলি ঘোষণা না করে কীভাবে ধরা পড়তে পারেন তার একটি দুর্দান্ত উদাহরণ এখানে var:

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

( iলুপের প্রতিটি পুনরাবৃত্তিতে পুনরায় সেট করা হয়, কারণ এটি স্থানীয়ভাবে forলুপে নয় তবে বিশ্বব্যাপী ঘোষিত হয়) অবশেষে অসীম লুপের ফলে


বাবা! এই টাইপগুলির কারণে যে সমস্ত বাগগুলি হতে পারে তা আমি কেবল কল্পনা করতে পারি।
বনসাইওক

2
আমি কৌতূহলী, কেন আপনি দুটি () এর সাথে যুক্তি হিসাবে আমি পাস করছি? (লুপের ভিতরে) এটি কি অপ্রয়োজনীয়?
কালিন

একটি () ফাংশনে এনপ্যাপুলেটেড দুটি () ফাংশনে যুক্তি উপেক্ষা করা হয়, যেহেতু ফাংশন দুটি () পরামিতি ছাড়াই সংজ্ঞায়িত করা হয়েছিল। আপনি বেশ সঠিক, এটি ভূমিকা গ্রহণ করে না কারণ এটি প্রয়োজন হয় না।
কে।

বাগ বা ফিচার?
দ্যমাস্টার

13

আমি বলব এটি varবেশিরভাগ পরিস্থিতিতে ব্যবহার করা ভাল ।

স্থানীয় পরিবর্তনগুলি সর্বদা বিশ্বব্যাপী স্কোপের পরিবর্তকের চেয়ে দ্রুত হয়।

আপনি যদি varকোনও ভেরিয়েবল ঘোষণার জন্য ব্যবহার না করেন তবে ভেরিয়েবলটি বিশ্বব্যাপী স্কোপে থাকবে।

আরও তথ্যের জন্য, আপনি গুগলে "স্কোপ চেইন জাভাস্ক্রিপ্ট" অনুসন্ধান করতে পারেন।


আপনি যদি ভেরিওয়ার্ড ব্যবহার করে কোনও ভেরিয়েবল ঘোষণা করেন, এটি রানটাইমে তৈরি হবে তাই এটি ধীর হওয়া উচিত নয়? কারণ অন্যটি বিশদ সময় তৈরি করা হয়।
বারে ভেলিওলু

@ রিউকাপ্লান - আরে, এটা কি সত্য? আমি গুগল করার চেষ্টা করেছি এবং এই বিষয়ে কোনও তথ্য পেতে পারি না! আপনার কি সেই দাবিতে উত্স কর্তৃত্ব আছে? থেক্স
মাইক রডেন্ট

@ রিউকাপ্লান পার্সিং / সংকলন আসলে কোড চালানো থেকে আলাদা।
gcampbell

11

ব্যবহার করবেন না var!

varএকটি ভেরিয়েবল ঘোষণার প্রাক ES6 উপায় ছিল। আমরা এখন ভবিষ্যতে , এবং আপনার যেমন কোডিং করা উচিত।

ব্যবহার করুন constএবংlet

const95% ক্ষেত্রে ব্যবহার করা উচিত। এটি এটিকে এমন করে তোলে যাতে পরিবর্তনশীল উল্লেখটি পরিবর্তন করতে না পারে, সুতরাং অ্যারে, অবজেক্ট এবং ডোম নোডের বৈশিষ্ট্যগুলি পরিবর্তন করতে পারে এবং সম্ভবত এটি হওয়া উচিত const

letপুনরায় নিয়োগের প্রত্যাশায় যে কোনও ভেরিয়েবলের জন্য ব্যবহার করা উচিত। এটি একটি for লুপের মধ্যে অন্তর্ভুক্ত। আপনি যদি কখনও varName =আরম্ভের বাইরে লিখেন তবে ব্যবহার করুন let

উভয়ই ব্লক স্তরের স্কোপিং রয়েছে, অন্যান্য বেশিরভাগ ভাষায় যেমন প্রত্যাশিত।


2
আপনার সমস্ত 'ভার' কে 'কনস্ট' দ্বারা প্রতিস্থাপন করুন (সমস্ত প্রতিস্থাপন করুন)। আপনার পুনরায় বরাদ্দ করা ভেরিয়েবলগুলি কোথায় তা আপনি দ্রুত লক্ষ্য করবেন notice আপনার যদি এগুলির মধ্যে অনেকগুলি থাকে তবে আপনি সম্ভবত অ্যান্টি-প্যাটার্নালি কোড দিন: সর্বাধিক পুনঃনির্ধারণযোগ্য ভেরিয়েবলগুলি ক্লোজারে বা অবজেক্ট-প্রোপার্টি হিসাবে এম্বেড করা যেতে পারে। আপনার যদি কয়েকটি থাকে: তাদের জন্য 'লেট' ব্যবহার করুন। অবশেষে, যদি কিছু ভেরিয়েবলগুলি 'var' এর সাথে মোটেও বিকৃত হয় না, তবে তারা অঘোষিত থাকবে এবং এখনও বিশ্বব্যাপী উপস্থিত রয়েছে, সাবধান হন। @ গিবল্ট মন্তব্য সম্পর্কে 'লুপের জন্য একটি' এর মধ্যে, "95% ক্ষেত্রে" ;-): এ জাতীয় লুপগুলি এড়াতে বাঞ্ছনীয়: অ্যারে পদ্ধতি দুর্দান্ত।
এলিজ এল'ওম

95% ক্ষেত্রে কনস্ট ব্যবহার করা উচিত বলে, মনে হচ্ছে আমরা ভাল অভ্যাস থেকে দূরে চলে যাচ্ছি।
আগামেমনাস

9

অন্য পার্থক্য যেমন

var a = a || [] ; // works 

যখন

a = a || [] ; // a is undefined error.

1
আপনি ব্যাখ্যা করতে পারেন কেন এটি 'ভ' এর সাথে সংজ্ঞায়িত ভেরিয়েবলের ক্ষেত্রে কার্যকর হয় এবং ভেরিয়েবলটি ভেরিয়ে সংজ্ঞাযুক্ত নয় কেন? অ্যাসাইনমেন্টের ডান দিকের মূল্যায়নের আগে ভেরিয়েবলটি তৈরি হয় var?
ম্যাট

6
@ লুসেক কারণ স্কোপের var aশীর্ষে উত্তোলন করা হয়েছে এবং নাল সেট করা আছে যা ঘোষণা করে তবে চলকটি আরম্ভ করে না, তারপরে অ্যাসাইনমেন্টে আপনার একটি অপরিজ্ঞাত নাল ভেরিয়েবলের একটি রেফারেন্স থাকে যা মিথ্যাতে মূল্যায়ন করে এবং এ্যাসাইনমেন্ট সেট করে []। পরেরটির জন্য, আপনাকে সম্পত্তির একটা কার্যভার রয়েছে aসম্পত্তির a। আপনি এমন কোনও সম্পত্তি অর্পণ করতে পারেন যা অস্তিত্বহীন - এ্যাসাইনমেন্টে তৈরি করা, তবে আপনি এমন সম্পত্তি থেকে পড়তে পারবেন না ReferenceErrorযা আপনাকে ছুঁড়ে ফেলা ছাড়া অস্তিত্বহীন ।
ইভান ক্যারল

1
@ ইভানক্রোল: এটি সুযোগের শীর্ষে উত্তোলিত হয়ে যায় এবং নাল পরিবর্তে অপরিজ্ঞায়িত হয়ে যায়।
মিথুনসথেেশ

8

varঅবিচ্ছিন্ন ওভাররাইটিংয়ের কারণ হিসাবে বৈশ্বিক সুযোগ এবং ভেরিয়েবলগুলি একে অপরের সাথে বিরোধের সৃষ্টি থেকে আটকাতে ব্যবহার করা সর্বদা একটি ভাল ধারণা।


8

ছাড়া var- গ্লোবাল ভেরিয়েবল।

সর্বদাvar স্টেটমেন্ট ব্যবহারের জন্য দৃ recommended়ভাবে সুপারিশ করা হয় , কারণ স্থানীয় প্রসঙ্গে ডিগ্রি গ্লোবাল ভেরিয়েবল - মন্দ is তবে, আপনার যদি এই নোংরা কৌশলটির প্রয়োজন হয়, আপনার পৃষ্ঠার শুরুতে মন্তব্যটি লিখতে হবে:

/* global: varname1, varname2... */

3

এই ধারণাটি বোঝার জন্য এটি আমি কোডের উদাহরণ হিসাবে লিখেছি:

var foo = 5; 
bar = 2;     
fooba = 3;

// Execute an anonymous function
(function() {    
    bar = 100;             //overwrites global scope bar
    var foo = 4;           //a new foo variable is created in this' function's scope
    var fooba = 900;       //same as above
    document.write(foo);   //prints 4
    document.write(bar);   //prints 100
    document.write(fooba); //prints 900
})();

document.write('<br/>');
document.write('<br/>');
document.write(foo);       //prints 5
document.write(bar);       //prints 100
document.write(fooba);     //prints 3

2
ফাংশনটি কোনওভাবেই "নামবিহীন" নয়। প্রকৃতপক্ষে, এটি সম্ভবত প্রদর্শিত হতে পারে হিসাবে এটি নামকরণ করা হয়েছে।
ইনগো বার্ক

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

3

@Chris এস মধ্যে ব্যবহারিক পার্থক্য (এবং বিপদ) প্রদর্শন একটা চমৎকার উদাহরণ দিয়েছেন varএবং কোন var। এখানে অন্য একটি, আমি এটি বিশেষত বিপজ্জনক বলে মনে করি কারণ পার্থক্যটি কেবলমাত্র একটি অ্যাসিনক্রোনাস পরিবেশে দৃশ্যমান তাই এটি পরীক্ষার সময় সহজেই পিছলে যায়।

আপনি যেমন নিম্নলিখিত স্নিপেট আউটপুট আশা করতে চান ["text"]:

function var_fun() {
  let array = []
  array.push('text')
  return array
}

console.log(var_fun())

নিম্নলিখিত স্নিপেটটিও ( letপূর্বে অনুপস্থিত নোট করুন array):

function var_fun() {
  array = []
  array.push('text')
  return array
}

console.log(var_fun())

তাত্পর্যপূর্ণভাবে ডেটা ম্যানিপুলেশন সম্পাদন করা এখনও একক নির্বাহকের সাথে একই ফল প্রকাশ করে:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

var_fun().then(result => {console.log(result)})

তবে একাধিক ব্যক্তির সাথে আলাদা আচরণ করে:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

যাইহোক ব্যবহার করুন:

function var_fun() {
  let array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})


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

2

যেহেতু কেউ কেউ এটি শেখার চেষ্টা করছে আমি এটি এটি দেখতে পারি। উপরোক্ত উদাহরণগুলি কোনও শিক্ষানবিশদের জন্য কিছুটা অতিরিক্ত জটিল হতে পারে।

আপনি যদি এই কোডটি চালান:

var local = true;
var global = true;


function test(){
  var local = false;
  var global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

আউটপুটটি পড়বে: মিথ্যা, মিথ্যা, সত্য, সত্য

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

var local = true;
var global = true;


function test(){
  local = false;
  global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

আউটপুটটি মিথ্যা, মিথ্যা, মিথ্যা, মিথ্যা

এটি কারণ স্থানীয় সুযোগ বা ফাংশনে একটি নতুন ভেরিয়েবল তৈরি করার পরিবর্তে এটি কেবল গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করে এবং তাদের মিথ্যাতে পুনরায় নিযুক্ত করে।


2

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

কর্মক্ষেত্রে নীচের স্ক্রিপ্টটি এখানে jsfiddle দেখুন

a = 1;// Defined outside the function without var
var b = 1;// Defined outside the function with var
alert("Starting outside of all functions... \n \n a, b defined but c, d not defined yet: \n a:" + a + "\n b:" + b + "\n \n (If I try to show the value of the undefined c or d, console.log would throw 'Uncaught ReferenceError: c is not defined' error and script would stop running!)");

function testVar1(){
    c = 1;// Defined inside the function without var
    var d = 1;// Defined inside the function with var
    alert("Now inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};


testVar1();
alert("Run the 1. function again...");
testVar1();

function testVar2(){
    var d = 1;// Defined inside the function with var
    alert("Now inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};

testVar2();

alert("Now outside of all functions... \n \n Final Values: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n You will not be able to see d here because then the value is requested, console.log would throw error 'Uncaught ReferenceError: d is not defined' and script would stop. \n ");
alert("**************\n Conclusion \n ************** \n \n 1. No matter declared with or without var (like a, b) if they get their value outside the function, they will preserve their value and also any other values that are added inside various functions through the script are preserved.\n 2. If the variable is declared without var inside a function (like c), it will act like the previous rule, it will preserve its value across all functions from now on. Either it got its first value in function testVar1() it still preserves the value and get additional value in function testVar2() \n 3. If the variable is declared with var inside a function only (like d in testVar1 or testVar2) it will will be undefined whenever the function ends. So it will be temporary variable in a function.");
alert("Now check console.log for the error when value d is requested next:");
alert(d);

উপসংহার

  1. ভেরের সাথে বা پرته ঘোষিত কোনও বিষয়ই (যেমন, খ) যদি তারা ফাংশনের বাইরে তাদের মান পায় তবে তারা তাদের মান সংরক্ষণ করবে এবং স্ক্রিপ্টের মাধ্যমে বিভিন্ন ফাংশনের অভ্যন্তরে যুক্ত হওয়া অন্য কোনও মান সংরক্ষণ করা হবে।
  2. যদি কোনও ফাংশনের অভ্যন্তরে ভেরিয়েবলটি ঘোষিত করা হয় (যেমন সি) তবে এটি আগের নিয়মের মতো কাজ করবে, এটি এখন থেকে সমস্ত ক্রিয়াকলাপের মধ্যে এর মান সংরক্ষণ করবে। হয় এটি ফাংশন টেস্টভিয়ার 1 এ এর ​​প্রথম মান পেয়েছে () এটি এখনও মানটি সংরক্ষণ করে এবং ফাংশন টেস্টভিয়ার 2 () এ অতিরিক্ত মান পান
  3. যদি ভেরিয়েবলটি কেবল কোনও ফাংশনের অভ্যন্তরে ভেরিয়ে ঘোষণা করা হয় (যেমন d টেস্টভিয়ার 1 বা টেস্টভাইয়ার 2 তে) এটি যখনই ফাংশন শেষ হবে তখনই এটি অপরিজ্ঞাত হবে। সুতরাং এটি একটি ফাংশনে অস্থায়ী পরিবর্তনশীল হবে।

এই বিষয়টি প্রদর্শনের জন্য একটি উদাহরণ তৈরি করতে সময় দেওয়ার জন্য ধন্যবাদ Thanks উপরের কোডটি নীচের অংশটি হারিয়েছে যাতে আপনি নিজের উত্তরটি সম্পাদনা করতে চাইতে পারেন: a = 1; // var var b = 1 ছাড়াই ফাংশনের বাইরে সংজ্ঞায়িত; // ওয়ার অ্যালার্ট সহ ফাংশনের বাইরে সংজ্ঞায়িত ("সমস্ত ফাংশনের বাইরে শুরু করা) ... \ n \ না, বি সংজ্ঞায়িত কিন্তু সি, ডি এখনও সংজ্ঞায়িত করা হয়নি: \ না: "+ এ +" \ nb: "+ বি +" \ n \ n (যদি আমি অপরিবর্তিত সি এর মান দেখানোর চেষ্টা করি বা ডি, কনসোল.লগ 'আনকচড রেফারেন্স এরিয়ার: সি সংজ্ঞায়িত নয়' ত্রুটি এবং স্ক্রিপ্ট চলমান বন্ধ করবে!) ");
সাঙ্কোফা

1

একটি কোডের অভ্যন্তরে যদি আপনি ভেরিয়েবল ব্যবহার না করেই ভেরিয়েবল ব্যবহার করেন তবে স্বয়ংক্রিয়ভাবে বর্ণের নামটি কী হবে তা বিশ্বব্যাপী সুযোগে স্থাপন করা হয়েছে যেমন:

someFunction() {
    var a = some_value; /*a has local scope and it cannot be accessed when this
    function is not active*/
    b = a; /*here it places "var b" at top of script i.e. gives b global scope or
    uses already defined global variable b */
}

1

স্কোপ ইস্যু ছাড়াও কিছু লোক উত্তোলনের কথা উল্লেখ করেছেন , কিন্তু কেউ উদাহরণ দেয়নি। বিশ্বব্যাপী সুযোগের জন্য এখানে একটি:

console.log(noErrorCase);
var noErrorCase = "you will reach that point";

console.log(runTimeError);
runTimeError = "you won't reach that point";


0

"Var" ভেরিয়েবলগুলি ব্যবহার না করে কেবল কোনও মান সেট করার সময় সংজ্ঞা দেওয়া যায়। উদাহরণে:

my_var;

গ্লোবাল স্কোপ বা অন্য কোনও সুযোগে কাজ করতে পারে না । এটির মতো মান হওয়া উচিত:

my_var = "value";

অন্যদিকে আপনি একটি স্থায়ী মত সংজ্ঞা দিতে পারেন;

var my_var;

এর মান হ'ল undefined(এর মানটি নয় nullএবং এটি nullআকর্ষণীয়ভাবে সমান নয় ।)।


my_var;আসলে একটি বৈধ অভিব্যক্তি বিবৃতি।
অভিধান

ভেরিয়েবলের আগে সংজ্ঞা দেওয়া থাকলে এটি বৈধ বিবৃতি। অন্যথায় এটি একটি ত্রুটি ফেলে ... "সংজ্ঞায়িত করা হয় না"।
umut

3
এটি আগে একটি ভেরিয়েবল সংজ্ঞায়িত করা হয়েছিল কিনা তা নির্বিশেষে এটি একটি বৈধ বিবৃতি । :) একটি বৈধ বিবৃতি একটি তীর ছুঁড়ে ফেলতে পারে এটি বিবৃতিটিকে অবৈধ করে না ।
অভিধান

আমি এটি সম্পর্কে বিভ্রান্ত। বৈধ বিবৃতি কি? এবং আপনি আমাকে একটি অবৈধ বিবৃতি উদাহরণ দিতে পারেন?
umut

আমাকে ক্ষমা চাইতে হবে - ইদানীং খুব বেশি ইসমাস্ক্রিপ্ট ব্যাকরণ হবে। my_var;একটি বৈধ অভিব্যক্তি বিবৃতি/my_var;একটি অবৈধ বিবৃতি হবে। তবে আমি যেমন বলেছি, এটি ব্যাকরণের ক্যাসুস্টিকস, আমি ক্ষমাপ্রার্থী, আমার মন্তব্যটি আসলে উপযুক্ত ছিল না।
অভিধান

0

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

যখন ভেরিয়েবলগুলি কী কীওয়ার্ড ব্যবহার না করে সংজ্ঞায়িত করা হয়, তখন এটি দেখতে সাধারণ একটি "অ্যাসাইনমেন্ট" অপারেশন।

যখন জাভাস্ক্রিপ্টে কোনও ভেরিয়েবলের জন্য মান নির্ধারিত হয়, দোভাষী প্রথমে নির্ধারিত অ্যাসাইনমেন্টের মতো একই প্রসঙ্গে / সুযোগে "পরিবর্তনশীল ঘোষণা" সন্ধান করার চেষ্টা করেন ” দোভাষী যখন কার্যকর করবেনdummyVariable = 20 , তখন ফাংশনের শুরুতে এটি ডামিভেরিয়েবল ঘোষণার সন্ধান করে। (যেহেতু সমস্ত পরিবর্তনীয় ঘোষণাগুলি জাভাস্ক্রিপ্ট দোভাষী দ্বারা প্রসঙ্গের শুরুতে স্থানান্তরিত হয় এবং এটিকে উত্তোলন বলা হয়)

আপনিও দেখতে চাইতে পারেন জাভাস্ক্রিপ্টে উত্তোলনের

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