কোটস এবং বন্ধনীর সাথে এবং ছাড়া সেটটাইমআউটের মধ্যে পার্থক্য


240

আমি জাভাস্ক্রিপ্ট শিখছি এবং আমি সম্প্রতি জাভাস্ক্রিপ্ট সময় সংক্রান্ত ঘটনা সম্পর্কে শিখেছি। যখন আমি সম্পর্কে শিখেছি setTimeoutW3Schools , আমি একটি অদ্ভুত চিত্র যা আমি মধ্যে সামনে ছুটে ছুটে করা হয়নি লক্ষ্য। তারা ডাবল উদ্ধৃতি ব্যবহার করছে এবং তারপরে ফাংশনটি কল করবে।

উদাহরণ:

setTimeout("alertMsg()", 3000);

আমি জানি যে জাভাস্ক্রিপ্টে ডাবল এবং একক উদ্ধৃতি মানে একটি স্ট্রিং।

এছাড়াও আমি দেখেছি যে আমিও এর মতো করতে পারি:

setTimeout(alertMsg, 3000);

এটি প্রথম বন্ধনীগুলির সাথে উল্লেখ করা হয়েছে, এটি প্রথম অনুলিপি অনুলিপি করা হয়েছে। আমি যখন উদ্ধৃতিগুলি এবং প্রথম বন্ধনী ব্যবহার করছি তখন এটি ক্ষিপ্ত হয়ে উঠছে।

যদি কেউ আমাকে এই তিনটি পদ্ধতির ব্যবহারের পার্থক্যটি ব্যাখ্যা করতে পারে তবে আমি খুশি হব setTimeout:

প্রথম বন্ধনীর সাথে:

setTimeout("alertMsg()", 3000);

উদ্ধৃতি এবং প্রথম বন্ধনী ছাড়াই:

setTimeout(alertMsg, 3000);

এবং তৃতীয়টি কেবল উদ্ধৃতিগুলি ব্যবহার করছে:

setTimeout("alertMsg", 3000);

এনবি: setTimeoutরেফারেন্সের জন্য আরও ভাল উত্স হ'ল এমডিএন


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

14
@ ম্যাথেজ "যদিও আমরা অনুভব করি যে ডাব্লু 3 স্কুলগুলি ভুল তথ্য দিয়ে সম্প্রদায়ের ক্ষতি করছে" " - প্রথম তিন লাইনের মধ্যে।
জুতো

1
@ জেফফ্রে হ্যাঁ আমি এটি দেখেছি কিন্তু নীচে যেখানে তারা এ সম্পর্কে তাদের কী পছন্দ করে না তা ব্যাখ্যা করে, "ডাব্লু 3 স্কুলগুলি সমস্যা হয়" বিভাগে, তারা যে তিনটি কারণে দেয় তার কোনওটিই সঠিক তথ্যের সাথে কিছু করার নেই। বাস্তবে "ভুল" যে কোনও কিছুর একটি উদাহরণও তাদের কাছে নেই। তাদের অভিযোগগুলি হ'ল তারা স্পষ্টভাবে বলে না যে তারা ডাব্লু 3 এর সাথে সম্পর্কিত নয়, তারা অপরিজ্ঞাত শংসাপত্রের জন্য চার্জ করে এবং তারা নতুন সামগ্রী (যেমন এইচটিএমএল 5) দিয়ে দ্রুত আপডেট করে না।
ম্যাথু

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

4
ছায়াময় শংসাপত্রগুলি একপাশে রেখে দেওয়া, এটি একটি শালীন রেফারেন্স রিসোর্স এবং এটির নিন্দা করার জন্য এটি এসওর পুরো পয়েন্টের প্রতি প্রতিক্রিয়াশীল।
worc

উত্তর:


382

ব্যবহার setIntervalবাsetTimeout

আপনার পক্ষে setTimeoutবা প্রথমে যুক্তি হিসাবে কোনও ফাংশনের রেফারেন্সটি পাস করতে হবে setInterval। এই রেফারেন্স আকারে হতে পারে:

  • একটি বেনামী ফাংশন

    setTimeout(function(){/* Look mah! No name! */},2000);
  • বিদ্যমান ফাংশনের একটি নাম

    function foo(){...}
    
    setTimeout(foo, 2000);
  • একটি চলক যা বিদ্যমান ফাংশনকে নির্দেশ করে

    var foo = function(){...};
    
    setTimeout(foo, 2000);

    মনে রাখবেন যে আমি "ফাংশন নাম" থেকে আলাদা করে "একটি ফাংশনে পরিবর্তনশীল" সেট করেছি। এটি স্পষ্ট নয় যে ভেরিয়েবল এবং ফাংশন নাম একই নাম স্থান দখল করে এবং একে অপরকে ক্লোবার করতে পারে।

তর্ক বিতরণ

একটি ফাংশন কল করতে এবং পরামিতিগুলি পাস করার জন্য, আপনি টাইমারকে বরাদ্দ করা কলব্যাকের ভিতরে ফাংশনটি কল করতে পারেন:

setTimeout(function(){
  foo(arg1, arg2, ...argN);
}, 1000);

হ্যান্ডলারের মধ্যে তর্কগুলি পাস করার জন্য আরও একটি পদ্ধতি রয়েছে, তবে এটি ক্রস ব্রাউজারের সাথে সামঞ্জস্যপূর্ণ নয়

setTimeout(foo, 2000, arg1, arg2, ...argN);

কলব্যাক প্রসঙ্গে

ডিফল্টরূপে, কার্যকর হলে কলব্যাকের প্রসঙ্গ ( thisটাইমার দ্বারা ডাকা ফাংশনের অভ্যন্তরের মান ) কার্যকর করা হয় বিশ্বব্যাপী অবজেক্ট window। আপনি এটি পরিবর্তন করতে চান, ব্যবহার করুন bind

setTimeout(function(){
  this === YOUR_CONTEXT; // true
}.bind(YOUR_CONTEXT), 2000);

নিরাপত্তা

যদিও এটা সম্ভব, আপনি উচিত একটি স্ট্রিং পাস না করার জন্য setTimeoutবা setInterval। একটি স্ট্রিং পাস করা স্ক্রিপ্ট হিসাবে স্ট্রিংগুলি সম্পাদন করে এমন একটি কার্যকারিতা তৈরি করে setTimeout()বা setInterval()ব্যবহার করেeval() যা স্বেচ্ছাসেবী এবং সম্ভাব্য ক্ষতিকারক স্ক্রিপ্ট সম্পাদনকে সম্ভব করে তোলে ।


আমি শিখেছি যে আপনি যখন কেবলমাত্র ফাংশনটির নামটি ব্যবহার করছেন তখন ফাংশনটি অনুলিপি করা হয় তবে আপনি কেন আপনার প্রথম উদাহরণে বলছেন যে সেটম্যান্ট ফু (ফাংশন) পাসের রেফারেন্সটি আমি ঝুঁকেছি সেই ফাংশনটি অনুলিপি করা হয়েছে? এবং আপনি আমাকে আরও লম্বা করতে পারেন দয়া করে এভাল সম্পর্কে।
ব্যবহারকারী 1316123

41
@ ব্যবহারকারী 1316123 ফাংশন কখনও অনুলিপি করা হয় না। বস্তু এবং অ্যারে একই। তারা রেফারেন্স দ্বারা পাস করা হয় । আপনার ডাব্লু 3 স্কুল পড়া বন্ধ করা উচিত। তারা ভাল চেয়ে বেশি ক্ষতি করছে
জোসেফ

4
@JosephtheDreamer ফাংশন হয় বস্তু। "একটি ফাংশনের নাম" এবং "একটি পরিবর্তনশীল যা কোনও ফাংশনকে বোঝায়" একই জিনিস। এছাড়াও, আপনি সরাসরি টাইমআউটে সেটআপ করার জন্য প্যারামিটারগুলি সরাসরি পাস করতে পারেন (এটির জন্য ল্যাম্বডায় মোড়ানোর দরকার নেই (যদিও আপনি যেমন বলেছেন - নতুন ব্রাউজারগুলি)। এছাড়াও, ব্যবহারকারীদের স্ক্রিপ্টগুলি কার্যকর করতে দেওয়া (তারা যেহেতু সর্বদা এটি করতে পারে) তা সমস্যা নয়, এটি অন্যান্য ব্যবহারকারীর কাছ থেকে ইনপুট গ্রহণ করে এবং এটি স্ক্রিপ্ট হিসাবে চালানো হয় The ব্যবহারকারীরা নিজেরাই সর্বদা কনসোলটি খুলতে পারে এবং নির্বিচারে জাভাস্ক্রিপ্ট কার্যকর করতে পারে
বেনজামিন গ্রুইনবাউম

@ বেনজামিন গ্রুয়েনবাউম আপনার দ্বিতীয় বাক্যে আমি প্রায় অভিন্ন মন্তব্য করতে চলেছিলাম। হাসি :)
এরিক

2
সঠিকভাবে কাজ করার জন্য আপনাকে সেট টাইমআউট করার জন্য কোনও ফাংশন ব্যবহার করার দরকার বুঝতে পারিনি। যে পরিষ্কার করার জন্য ধন্যবাদ।
ম্যাট ডেল

3

আমার মনে হয় আপনি যে সেটটাইমআউট ফাংশনটি লিখেছেন তা চালানো হচ্ছে না। আপনি jquery ব্যবহার করেন, আপনি এটি করে এটি সঠিকভাবে চালানো করতে পারেন:

    function alertMsg() {
      //your func
    }

    $(document).ready(function() {
       setTimeout(alertMsg,3000); 
       // the function you called by setTimeout must not be a string.
    });

আমি মনে করি ঠিক আপনার মতো তবে লিঙ্কটি w3schools.com/js/js_timing.asp অন্যথায়
সোমটিং

যদি আমি সঠিকভাবে বুঝতে পারি যখন আমি বন্ধনী ব্যবহার করি তখন আমি কেবল সেট টাইমআউট পদ্ধতিযুক্ত ফাংশনটিকে উল্লেখ করতে পারি যা কেবলমাত্র স্থানীয় সুযোগে বন্ধনীতে উপলব্ধ ফাংশনটি বেকস করে?
ব্যবহারকারী 1316123

2

পুরোপুরি জোসেফের সাথে একমত।

এটি পরীক্ষা করার জন্য এখানে একটি বেহালতা: http://jsfiddle.net/nicocube/63s2s/

ফিডাল প্রসঙ্গে, আমার মতে স্ট্রিং আর্গুমেন্টটি কাজ করে না কারণ বিশ্বব্যাপী ক্ষেত্রের মধ্যে ফাংশনটি সংজ্ঞায়িত হয়নি।


w3schools.com/js/js_timing.asp আপনি লিঙ্কটি প্রবেশ করতে পারলে দয়া করে দেখুন এবং বেকোস দেখুন জোসেফ তার বিপজ্জনক বলেছে তবে আপনি যদি লিঙ্কটি প্রবেশ করেন তবে এটি কাজ করছে
ব্যবহারকারী 1316123

ছেলেরা দয়া করে এটি দেখুন: quirksmode.org/js/this.html এই লিঙ্কটি বলেছে যে একটি
ফানক

হ্যাঁ এটি করতে পারে, কারণ ফাংশনটি জেএসে অবজেক্ট। ইওল সহ সমস্যাটি হ'ল এটি বিশ্বব্যাপী প্রেক্ষাপটে উদ্ভূত হবে এবং স্থানীয় প্রেক্ষাপটটি পেতে ব্যর্থ হয়েছিল যা একটি মূর্ছনায় ঘটে।
নিকোকিউব

অনুগ্রহ করে আপনি কিছু শব্দে ব্যাখ্যা করতে পারেন দয়া করে।
ব্যবহারকারী 1316123


1

কার্যের প্রথম পরামিতি হিসাবে আপনি স্ট্রিং পাস করার ক্ষেত্রে বাস্তবে কী ঘটে happens

সেটটাইমআউট ( 'string', number)

এটি চলার সময় হলে প্রথম numberপরমের মান মূল্যায়ন হয় ( মিলিসেকেন্ডগুলি পেরিয়ে যাওয়ার পরে )। মূলত এটি সমান

সেটটাইমআউট ( eval('string'), number)

এই

একটি বিকল্প বাক্য গঠন যা আপনাকে ফাংশনের পরিবর্তে একটি স্ট্রিং অন্তর্ভুক্ত করতে সহায়তা করে, যা টাইমারের মেয়াদ শেষ হওয়ার সাথে সাথে সংকলন ও কার্যকর করা হয়। এই সিনট্যাক্সটি একই কারণগুলির জন্য সুপারিশ করা হয় না যা eval () ব্যবহার করে সুরক্ষা ঝুঁকিপূর্ণ করে তোলে।

সুতরাং আপনি যে নমুনাগুলি উল্লেখ করেছেন সেগুলি ভাল নমুনা নয় এবং বিভিন্ন প্রসঙ্গে বা কেবল সাধারণ টাইপও দেওয়া যেতে পারে।

যদি আপনি এটির অনুরোধ করেন তবে setTimeout(something, number)প্রথম প্যারামিটারটি স্ট্রিং নয়, তবে যাকে বলা হয় তাকে নির্দেশক something। এবং আবার যদি somethingস্ট্রিং হয় - তবে তা মূল্যায়ন করা হবে। তবে এটি যদি ফাংশন হয় তবে ফাংশনটি কার্যকর করা হবে। jsbin নমুনা


0
    ##If i want to wait for some response from server or any action we use setTimeOut.

    functionOne =function(){
    console.info("First");

    setTimeout(()=>{
    console.info("After timeOut 1");
    },5000);
    console.info("only setTimeOut() inside code waiting..");
    }

    functionTwo =function(){
    console.info("second");
    }
    functionOne();
    functionTwo();

## So here console.info("After timeOut 1"); will be executed after time elapsed.
Output:
******************************************************************************* 
First
only setTimeOut() inside code waiting..
second
undefined
After timeOut 1  // executed after time elapsed.

-1

প্রথম বন্ধনীর সাথে:

setTimeout("alertMsg()", 3000); // It work, here it treat as a function

উদ্ধৃতি এবং প্রথম বন্ধনী ছাড়াই:

setTimeout(alertMsg, 3000); // It also work, here it treat as a function

এবং তৃতীয়টি কেবল উদ্ধৃতিগুলি ব্যবহার করছে:

setTimeout("alertMsg", 3000); // It not work, here it treat as a string

function alertMsg1() {
        alert("message 1");
    }
    function alertMsg2() {
        alert("message 2");
    }
    function alertMsg3() {
        alert("message 3");
    }
    function alertMsg4() {
        alert("message 4");
    }

    // this work after 2 second
    setTimeout(alertMsg1, 2000);

    // This work immediately
    setTimeout(alertMsg2(), 4000);

    // this fail
    setTimeout('alertMsg3', 6000);

    // this work after 8second
    setTimeout('alertMsg4()', 8000);

উপরের উদাহরণে প্রথম অ্যালার্ট এমএসজি 2 () ফাংশন কলটি তত্ক্ষণাত্ (আমরা 4 এস সময় দেবে কিন্তু তা বিরক্ত করে না) সতর্কতা মেসজি 1 () (2 সেকেন্ডের একটি সময়ের অপেক্ষা) তারপর সতর্কতা এমএসজি 4 () (8 সেকেন্ডের সময়ের অপেক্ষা) কিন্তু সতর্কতা এমএসজি 3 () কাজ করছে না কারণ আমরা এটিকে দলগুলির ব্যতীত উদ্ধৃতিতে রেখেছি যাতে এটি স্ট্রিং হিসাবে বিবেচিত হয়।


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