অন্য জাভাস্ক্রিপ্ট ফাংশন এগিয়ে তর্ক বিতরণ


386

আমি কোনও সাফল্য ছাড়াই নিম্নলিখিতগুলি চেষ্টা করেছি:

function a(args){
    b(arguments);
}

function b(args){
    // arguments are lost?
}

a(1,2,3);

ফাংশন এ, আমি আর্গুমেন্টের অ্যারে অ্যাক্সেস করতে আর্গুমেন্ট কীওয়ার্ডটি ব্যবহার করতে পারি, ফাংশন বি এ হারিয়ে গেছে are আমি করার মতো অন্য জাভাস্ক্রিপ্ট ফাংশনটিতে যুক্তিগুলি পাশ করার কোনও উপায় আছে কি?


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

@ জুলস এখনও এই সমস্ত বছর পরে আবার খুলতে ভোট । অন্যান্য মানুষের মূল্যবান কাজ জ্বলানোর জন্য ব্যাজ কী? ঘুরে বেড়াতে হবে অনেকগুলি।
বব স্টেইন

উত্তর:


542

ব্যবহার করুন .apply()একই প্রবেশাধিকার আছে argumentsফাংশনে bএই মত:

function a(){
    b.apply(null, arguments);
}
function b(){
   alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);​

আপনি এটি এখানে পরীক্ষা করতে পারেন


21
@ ব্রেট - আপনি এটিকে একটি অ্যারেতে অনুলিপি করতে পারেন এবং এটি পেরিয়ে যাওয়ার আগে তা var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
হেরফের করুন

18
তবে এটির applyমতো ব্যবহারের সুযোগটি স্ক্রুটি বাড়িয়ে তুলতে পারে b(যদি এটি কোনও কোনও বস্তুর অভ্যন্তরীণ ফাংশন উদাহরণস্বরূপ হয়)
vsync

3
@vsync ভাল পয়েন্ট, তবে সমস্যা সমাধান করা সহজ: প্রয়োগ করার জন্য প্রথম যুক্তি হিসাবে বস্তুটি পাস করুন।
টেড লিসি

11
"আরগস" এবং "আর্গুমেন্ট" একসাথে ব্যবহার করার কোনও মানে নেই ...
ডাবডে

3
তবে তারপরে "এই" টি খ এর মূলটি বাদে অন্য কোনও কিছুর পরিবর্তিত হতে পারে।
trusktr

223

স্প্রেড অপারেটর

স্প্রেড অপারেটর এমন এক জায়গায় অভিব্যক্তি প্রসারিত করতে দেয় যেখানে একাধিক যুক্তি (ফাংশন কলগুলির জন্য) বা একাধিক উপাদান (অ্যারে আক্ষরিক জন্য) প্রত্যাশিত।

ECMAScript ES6 একটি নতুন অপারেটর যুক্ত করেছে যা আপনাকে আরও ব্যবহারিক উপায়ে এটি করতে দেয়: ... স্প্রেড অপারেটর

applyপদ্ধতিটি ব্যবহার না করে উদাহরণ :

function a(...args){
  b(...args);
  b(6, ...args, 8) // You can even add more elements
}
function b(){
  console.log(arguments)
}

a(1, 2, 3)

Note যদি আপনার ব্রাউজারটি এখনও ES5 ব্যবহার করে তবে এই স্নিপেটটি একটি সিনট্যাক্স ত্রুটি প্রদান করে।

সম্পাদকের দ্রষ্টব্য: স্নিপেট যেহেতু ব্যবহার করে console.log(), ফলাফলটি দেখতে আপনাকে অবশ্যই আপনার ব্রাউজারের জেএস কনসোলটি খুলতে হবে - কোনও পৃষ্ঠাতে ফলাফল নেই।

এটি এই ফলাফলটি প্রদর্শন করবে:

উদাহরণস্বরূপ স্প্রেড অপারেটরের চিত্র

সংক্ষেপে, স্প্রেড অপারেটর বিভিন্ন উদ্দেশ্যে ব্যবহার করা যেতে পারে যদি আপনি অ্যারে ব্যবহার করেন তবে এটি ফাংশন আর্গুমেন্টের জন্যও ব্যবহার করা যেতে পারে, আপনি সরকারী ডক্সে বর্ণিত অনুরূপ উদাহরণ দেখতে পাবেন: বাকী পরামিতি


6
এটি একটি খুব সুন্দর অপারেটর এবং আমি এটি ব্যবহার করার জন্য সত্যই অপেক্ষা করছি। তবে এটি এখনও ঘটবে না। ইতিমধ্যে স্প্রেড অপারেটরকে সমর্থনকারী একমাত্র ব্রাউজারটি এই মুহুর্তে এফএফ। : সামঞ্জস্য টেবিল একটি সম্পূর্ণ জন্য, আপ টু ডেট তথ্য দেখুন kangax.github.io/compat-table/es6/#spread_%28...%29_operator
TMG

10
কেন এটি ব্যবহার করা উচিত নয়? বাবেলের সাথে স্থানান্তরিত করা তুলনামূলকভাবে সহজ, আপনি সমস্ত নতুন বৈশিষ্ট্য এবং পুরানো ব্রাউজারগুলির সাথে অনেক বেশি সামঞ্জস্য পাবেন।
adgelbfish

এটি প্রথম সমাধানের চেয়ে ভাল কারণ এটি তীর অপারেটরের সাথে সংজ্ঞায়িত ফাংশনে কাজ করে।
সরফাতা

আপনার যা দরকার তা আত ...argsমধ্যে aফাংশন। আপনি কেবল কোনও যুক্তি ছাড়াই একটি ফাংশন করতে পারেন এবং এগুলি তাদের কাছে bদিয়ে যেতে পারেন...arguments
ক্রোনোকলি

1
এই উত্তরটি যে কারও কাছে পড়ছে: @ ক্রোনোকলির মন্তব্যের বিপরীতে, যদি আপনার নেটিভ ফাংশন থাকে তবে স্পষ্ট করে নির্দিষ্ট করে দেওয়া উচিত যে ইনপুট ...argsহিসাবে aগুরুত্বপূর্ণ।
আর্শিয়ার 1001

81

ব্যাখ্যা অন্যান্য উত্তর সরবরাহ কেউই আসল আর্গুমেন্ট যে হয় এখনও পাওয়া, কিন্তু মূল অবস্থানে না argumentsঅবজেক্ট।

argumentsবস্তুর প্রতিটি প্রকৃত ফাংশন প্রদান করা প্যারামিটার জন্য এক উপাদান ধারণ করে। আপনি কল যখন aসংখ্যা: আপনি তিনটি আর্গুমেন্ট সরবরাহ 1, 2, এবং, 3। সুতরাং, argumentsরয়েছে [1, 2, 3]

function a(args){
    console.log(arguments) // [1, 2, 3]
    b(arguments);
}

আপনি যখন কল করেন bতবে আপনি ঠিক একটি তর্কটি পাস করেন : aএর argumentsঅবজেক্ট। তাই argumentsরয়েছে [[1, 2, 3]](যেমন এক উপাদান, যা aএর argumentsবস্তু, যার মূল আর্গুমেন্ট ধারণকারী বৈশিষ্ট্য আছে a)।

function b(args){
    // arguments are lost?
    console.log(arguments) // [[1, 2, 3]]
}

a(1,2,3);

@ নিক যেমন প্রদর্শিত হয়েছে, আপনি কলটিতে applyএকটি সেট argumentsঅবজেক্ট সরবরাহ করতে ব্যবহার করতে পারেন ।

নিম্নলিখিতগুলি একই ফলাফল অর্জন করে:

function a(args){
    b(arguments[0], arguments[1], arguments[2]); // three arguments
}

তবে applyসাধারণ ক্ষেত্রে সঠিক সমাধান।


আপনি সবসময় পাস thisকরা উচিত apply?
Flimm

1
@ ফ্লিম — হ্যাঁ, যেহেতু যুক্তিগুলি দ্বিতীয় যুক্তি, তাই প্রথম যুক্তির জন্য কিছু থাকতে হবে (এটি নাল হতে পারে )।
রবজি

0

এটা চেষ্টা কর

function global_func(...args){
  for(let i of args){
    console.log(i)
  }
}


global_func('task_name', 'action', [{x: 'x'},{x: 'x'}], {x: 'x'}, ['x1','x2'], 1, null, undefined, false, true)




//task_name
//action
//(2) [{...},
//    {...}]
//    {
//        x:"x"
//    }
//(2) [
//        "x1",
//        "x2"
//    ]
//1
//null
//undefined
//false
//true
//func
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.