আমি জাভাস্ক্রিপ্ট ফাংশনে কোনও পরামিতি পাস না করলে কী হবে?


90

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

নমুনা ফাংশন

function myfunction(x) {
    alert("This is a sample alert");
}

এখন যদি আমি ফাংশনটি কল করি তবে আমাকে myfunction();সতর্কতা উপস্থাপন করা হবে। আমি যখন কোনও প্যারামিটার পাস না করে থাকি তখন কেন আমি কোনও ত্রুটি বা সতর্কতা ছাড়াই ফাংশনটি কল করতে পেরেছি?

সম্পাদনা

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



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

@ স্ক্র্যাপকোলা - ওভারলোডিংয়ের পাশাপাশি ফাংশনটি সংজ্ঞায়িত করা হয়নি এমন পরামিতিগুলিতে পাস করার অর্থ কী? আপনি উদাহরণ দিতে পারেন?
চিনাবাদু মনকি

4
পুনঃটুইট তার অর্থ, আপনার দুটি ফাংশন থাকতে পারে না: function foo(x){...}এবং function foo(x,y,z){...}প্রতিটি নামের জন্য আপনার কেবল একটি ফাংশন থাকতে পারে।
gdoron মনিকা

4
পুনঃটুইট হ্যাঁ, আপনি function overloadingজেএসে থাকতে পারবেন না , এটি উপহাস করার পরেও আপনার অন্য উপায় রয়েছে।
gdoron মনিকা

উত্তর:


114

কিছুই ঘটবে না - জাভাস্ক্রিপ্টে প্যারামিটারগুলি পাস করা isচ্ছিক বলে আপনি কোনও ত্রুটি বা একটি সতর্কতা পাবেন না।
"সরবরাহ করা হয়নি" এমন সমস্ত পরামিতিগুলির undefinedমান থাকবে

function foo(x, y, z){
    //...
}

foo(1);

fooএখন ফাংশনের ভিতরে :

function foo(x, y, z){
    x === 1
    y === undefined
    z === undefined
}

আপনি আরও আর্গুমেন্ট পাস করতে পারেন, যেমন:

foo(1,2,3,4,5,7); // Valid!

আপনি arguments.lengthফাংশনটির ভিতরে থেকে সরবরাহিত পরিমাণগুলির প্যারামিটারগুলি জানতে পারবেন ।

function foo(x, y, z) {
    console.log('x value: ' + x);
    console.log('y value: ' + y);
    console.log('z value: ' + z);
    console.log('Arguments length: ' + arguments.length);
}
console.log('Zero parameters');
foo();
console.log('Four parameters');
foo(1, 2, 3, 4);

যে কোনও পরিমাণ প্যারামিটার হ্যান্ডেল করে এমন দরকারী ফাংশনের উদাহরণ:

function max() {
    var maxValue = arguments[0];
    for (var i = 1; i < arguments.length; i++) {
        if (maxValue < arguments[i]) {
            maxValue = arguments[i];
        }
    }
    return maxValue;
}

alert(max(1, 5, 7, 2, 88, 32, 44));


লাইভ ডেমো জন্য ধন্যবাদ। এত ভাল উত্তর আশা করেনি। সুতরাং যদি আমার মতো কোনও ফাংশন থাকে function myfunction (a,b){}এবং মানগুলি আমার ফাংশন (1,2,3,4,5) দিয়ে যায় তবে আমি এটি গ্রহণ করি যে এটি এখনও বৈধ? প্রত্যাশা কি কিছু সতর্কতা বা ত্রুটি হবে?
চিনাবাদু মনকি

দুঃখিত, আপনি কি কমান্ডটি console.logপাশাপাশি আর্গুমেন্ট.সামগ্রীটি বিশদভাবে বর্ণনা করবেন ?
চিনাবাদু মনকি

পুনঃটুইট বৈধ! কোনও সতর্কতা নেই ত্রুটি, এটি এমনকি কার্যকর হবে, আমি আপনাকে একটি মুহুর্তে একটি ডেমো দেব।
gdoron মনিকা

4
পুনঃটুইট এটি IE এর সাথেও কাজ করে যদি আপনার বিকাশকারীদের কনসোল ইনস্টল থাকে তবে আমি মনে করি এটি IE8 + থেকে ডিফল্টরূপে ইনস্টল করা আছে। আপনি কী লিখেছেন তা আমি বুঝতে পারি নি alert
gdoron মনিকা

4
পুনঃটুইট 1.return এটিকে উপেক্ষা করার পরে আপনার কোড থাকতে পারে না । ২. আপনি ত্রুটি বা সতর্কতা পাবেন না। এই
ডেমোটি

10

জাভাস্ক্রিপ্ট ফাংশনে সমস্ত আর্গুমেন্ট alচ্ছিক ("শিথিলভাবে টাইপ করা" পড়ুন)।

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

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

arguments[0]
arguments[1]
arguments[2]
  • জাভাস্ক্রিপ্ট - সংজ্ঞা গাইড, 5 ম সংস্করণ

7

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

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

function x(a, b, c) {
  // ...
}

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

একই টোকেন দ্বারা, আপনি কোনও প্যারামিটার ছাড়াই কোনও ফাংশন সংজ্ঞায়িত করতে পারেন এবং তারপরে argumentsঅবজেক্টের মাধ্যমে এগুলি "সন্ধান" করুন :

function noArgs() {
  var a = arguments[0], b = arguments[1], c = arguments[2];
  // ...
}

সুতরাং যে নয় বেশ প্রথম ফাংশন হিসাবে একই, কিন্তু এটা ঘনিষ্ঠ সবচেয়ে উপায়গুলির কার্যত গণনা আছে।

জাভাস্ক্রিপ্টের "অপরিজ্ঞাত" মান একটি মান, তবে ভাষা বলতে গেলে শব্দার্থকতা একরকম অস্বাভাবিক। বিশেষত এটি nullমানটির মতো নয়। এছাড়াও, "অপরিজ্ঞাত" নিজেই কোনও মূলশব্দ নয়; এটি কেবল একটি আধা-বিশেষ পরিবর্তনশীল নাম!


আপনি optional"সত্যই কোনও মান নয়" এর অর্থটি কী বোঝাতে চেয়েছিলেন তা আরও ব্যাখ্যা করতে পারেন undefined?
চিনাবাদু মনকি

@ পিএনটসমনকি - যদি ভেরিয়েবলটি দেওয়া না হয় তবে তা হবে undefined
ডেরেক 朕 會 功夫

@ পয়েন্টি - ঘোষিত কোনও প্যারামিটার আসলে কোনও মানের সাথে আবদ্ধ হওয়ার কোনও গ্যারান্টি নেই এর অর্থ কী?
চিনাবাদু মনকি

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

3

অন্যান্য ভাষার মতো ফাংশন প্যারামিটারগুলির জন্য জাভাস্ক্রিপ্টের ডিফল্ট মান নেই। সুতরাং, আপনি যতগুলি চান বা যতটুকু ছোট যুক্তি পাস করতে পারেন।

আপনি যদি কোনও মান পাস না করেন তবে প্যারামিটারটি হয় undefined

function myfunction(x) {
    alert(x);
}

myfunction(); // alerts undefined
myfunction(1); // alerts 1
myfunction(1,2,3); // alerts 1

আপনি যদি স্বাক্ষরের চেয়ে বেশি পরামিতিগুলি পাস করেন তবে আপনি ব্যবহার করতে পারেন arguments

function myfunction(x) {
    alert(x);
    console.log(arguments);
}

myfunction(1,2,3); // alerts 1, logs [1,2,3]

ধন্যবাদ ক্রস পোস্টিংয়ের পরিবর্তে, আপনি দয়া করে আমার উদাহরণটি দেখতে পাচ্ছেন যে আমি ডেভিড থমাসকে দিয়েছিলাম যেহেতু আমি এখনও ত্রুটি undefined
পেয়েছি

@ পিনটসমোনকি: হাহ? তোমার সমস্যা কি?
রকেট হাজমত

প্রতি সমস্যা নেই। আপনি উত্তরগুলিতে অন্তর্ভুক্ত করেছেন এমন আরও বেশি পরামিতিগুলি পাস করার বিষয়ে আমি ডেভিডকে আমার ফলোআপ প্রশ্নটি উল্লেখ করছিলাম। আমি যেটি পুরোপুরি অনুসরণ করি না তা কি আপনি বোঝাতে চাইছেন logs? এটি কোথায় লগ করে?
চিনাবাদামনি

4
@ পিনটসমনকি: এটি আপনার "জাভাস্ক্রিপ্ট কনসোল" এ লগ করে। বেশিরভাগ ব্রাউজারে আপনি টিপতে F12বা Ctrl+Shift+Jএটিতে যেতে পারেন।
রকেট হাজমত

4
প্রথম বাক্যটি ES2015 হিসাবে পুরানো ... ...
হেরেটিক বানর

2

ফাংশনে উল্লিখিত একের চেয়ে আপনি আরও যুক্তি সরবরাহ করতে পারেন

myFunction(1,2,3,4,5,6,7,'etc');

argumentsপ্রদত্ত যুক্তি দেখার জন্য আপনি যে বৈশিষ্ট্যটিকে অ্যারে ব্যবহার করতে পারেন ।


@ আলবার্ট আর্গুমেন্টগুলি অ্যারের মতো অ্যারেটি নয় যেমন দেখুন দেখুন
মাহি

1

কারণ ফাংশনটি আপনি যে প্যারামিটারটি দিয়েছিলেন বলে অনুমান করে তার সাথে কাজ করতে সক্ষম হওয়ার আশা না হওয়া পর্যন্ত কোনও ত্রুটি নেই।

উদাহরণ স্বরূপ:

function myfunction(x) {
    return x*2;
}

একটি ত্রুটি নিক্ষেপ করা হবে; তবে সম্ভবত শুধুমাত্র একটি NaN(এই ক্ষেত্রে) বা এ variable is undefined


ঠিক আছে, যতক্ষণ না আমি ফাংশনটিতে প্যারামিটারটি উল্লেখ করি না, আমি ত্রুটি পাব না? এটা কি সঠিক?
চিনাবাদামমন্কি

এখন আমি যদি আপনার প্রদত্ত উদাহরণটি বিশদভাবে বর্ণনা করি function myfunction(a,b) { var calc = a+b; return;}এবং তারপরে ফাংশনটির দিকে কল document.write(myfunction(1.2));করি তবে কেন আমি এখনও undefinedপ্যারামিটারটি পাস করার পরেও এর মূল্য পাই?
চিনাবাদু মনকি

4
কারণ আপনি কিছুই ফিরিয়ে দিচ্ছেন না। আপনাকে স্পষ্টভাবে, উদাহরণস্বরূপ, একটি মান ফিরিয়ে দিতে হবে: হয় return calc; বা return a+b;(শেষ লাইন হিসাবে, স্পষ্টতই; এবং পরবর্তীটির returnস্থলে var calc)।
ডেভিড মনিকা

সুতরাং আপনি বলতে চাইছি আমি যদি একটি ভেরিয়েবল ঘোষণা করতে হবে না return a+b;?
চিনাবাদু মনকি

@ পানটসমোনকি - আপনি return এখানে আরও পড়তে পারেন ।
ডেরেক 朕 會 功夫

0

আপনি যদি যুক্তি বাদ দেন তবে এর মান হবে undefined। এটি আপনাকে বেশ সহজেই alচ্ছিক প্যারামিটার তৈরি করতে সক্ষম করে।

আর একটি বৈশিষ্ট্য হ'ল কোনও পরামিতি ছাড়াই একটি ফাংশন সংজ্ঞায়িত করার এবং argumentsঅবজেক্টটির ব্যবহার করে সফলভাবে যুক্তি দিয়ে কল করার ক্ষমতা । এটি আপনাকে সহজেই পরিবর্তনশীল-দৈর্ঘ্যের আর্গুমেন্ট অ্যারে তৈরি করতে দেয়।


0

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

console.log(x) 

ভিএম 15৩৩ দেয়: 1 অব্যাহত রেফারেন্স এরিয়ার: এক্স এর সাথে সংজ্ঞায়িত করা হয়নি

function test(x) {
console.log(x)
}
test(); 

অপরিশোধিত দেয়। এটি কারণ ফাংশন পরীক্ষা () ব্রাউজার দ্বারা নতুন করে লিখেছেন:

function test(x) {
    var x;
    console.log(x)
    }

আরেকটি উদাহরণ : -

var x =5 ;
function test(x) {
console.log(x)
}
test(); 

ফাংশন হয়ে ওঠার সাথে সাথে এখনও এটি অপরিজ্ঞাত

function test(x) {
    var x;
    console.log(x)
    }

নীচের উদাহরণে সতর্কতা অপরিশোধিত দেবে: -

    var x =5;
    function test() {
    alert(x);
    var x =10;
    }

test(); 

উপরের ফাংশনটি হয়ে উঠবে: -

 function test() {
    var x;
    alert(x);
    x =10;
    }

কোনও ফাংশনের অভ্যন্তরে জাভাস্ক্রিপ্ট ভেরিয়েবলের সুযোগ হ'ল ফাংশন স্তরের স্কোপ এবং ব্লক স্তর নয়। যেমন যেমন

function varScope() {

for(var i = 0; i < 10; i++){
    for(var j = 0; j < 5; j++){}
        console.log("j is "+j)
    }
    console.log("i is "+i);


}
varScope();

আউটপুট হিসাবে দেবে:

j is 5 
i is 10

আবার ফাংশনটি হয়ে উঠেছে: -

  function varScope() {
    var i;
    var j;
    for(i = 0; i < 10; i++){
        for(j = 0; j < 5; j++){}
            console.log("j is "+j)
        }
        console.log("i is "+i);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.