জাভাস্ক্রিপ্টে রেফারেন্স সহ ভেরিয়েবলগুলি পাস করুন


285

আমি কীভাবে জাভাস্ক্রিপ্টে রেফারেন্স দিয়ে ভেরিয়েবলগুলি পাস করব? আমার কাছে 3 টি ভেরিয়েবল রয়েছে যা আমি বেশ কয়েকটি অপারেশন করতে চাই, তাই আমি এগুলি লুপের জন্য রাখতে এবং প্রতিটিটির জন্য অপারেশন সম্পাদন করতে চাই।

সুডোকোড:

myArray = new Array(var1, var2, var3);
for (var x = 0; x < myArray.length; x++){
    //do stuff to the array
    makePretty(myArray[x]);
}
//now do stuff to the updated vars

এই কাজ করতে সবচেয়ে ভালো উপায় কি?


31
আপনি 'পাস বাই রেফারেন্স' সম্পর্কে কথা বলছেন, তবে আপনার উদাহরণে কোনও ফাংশন কল নেই তাই আপনার উদাহরণে কোনও পাসিং নেই। আপনি কী করতে চাইছেন তা দয়া করে পরিষ্কার করুন।
jفر00

1
বিভ্রান্তির জন্য দুঃখিত. আমার বিশেষভাবে কোনও ফাংশন লেখার দরকার নেই তাই 'রেফারেন্স বাই পাস' শব্দের দুর্বল পছন্দ ছিল। আমি কেবল না লিখে ভেরিয়েবলের কিছু ক্রিয়াকলাপ সম্পাদন করতে সক্ষম হতে চাই makePretty(var1); makePretty(var2); makePretty(var3); ...
BFTrick

আপনার মন্তব্যের উপর ভিত্তি করে: arr = [var1, var2, var3]; for (var i = 0, len = arr.length; i < len; i++) { arr[i] = makePretty(arr[i]); }- আপনাকে কেবল makePrettyঅ্যারের স্লটে ফিরে আসা মানটি সংরক্ষণ করতে হবে ।
dylnmc

উত্তর:


415

জাভাস্ক্রিপ্টে কোনও "পাস বাই রেফারেন্স" উপলব্ধ নেই। আপনি কোনও বস্তুকে পাস করতে পারেন (যা বলতে গেলে, আপনি কোনও বস্তুর একটি রেফারেন্স পাস-বাই-ভ্যালু করতে পারেন) এবং তারপরে একটি ফাংশন অবজেক্টের বিষয়বস্তুগুলিকে সংশোধন করতে পারেন:

function alterObject(obj) {
  obj.foo = "goodbye";
}

var myObj = { foo: "hello world" };

alterObject(myObj);

alert(myObj.foo); // "goodbye" instead of "hello world"

আপনি চাইলে একটি সংখ্যাসূচক সূচকের সাথে অ্যারের বৈশিষ্ট্যগুলি নিয়ে পুনরাবৃত্তি করতে পারেন এবং আপনি চাইলে অ্যারের প্রতিটি কক্ষকে সংশোধন করতে পারেন।

var arr = [1, 2, 3];

for (var i = 0; i < arr.length; i++) { 
    arr[i] = arr[i] + 1; 
}

এটি উল্লেখ করা গুরুত্বপূর্ণ যে "পাস-বাই-রেফারেন্স" একটি খুব নির্দিষ্ট শব্দ। এর অর্থ এই নয় যে কোনও পরিবর্তনযোগ্য বস্তুর রেফারেন্স দেওয়া সম্ভব। পরিবর্তে, এর অর্থ হল যে কোনও ফাংশনকে কলিং প্রসঙ্গে সেই মানটি সংশোধন করার অনুমতি দেওয়া যায় এমনভাবে একটি সাধারণ ভেরিয়েবল পাস করা সম্ভব । তাই:

 function swap(a, b) {
   var tmp = a;
   a = b;
   b = tmp; //assign tmp to b
 }

 var x = 1, y = 2;
 swap(x, y);

 alert("x is " + x + ", y is " + y); // "x is 1, y is 2"

C- এর মতো একটি ভাষায় ++ এটা যে কারণ যে ভাষা করতে সম্ভব করে (সাজানোর অফ) পাস-বাই-রেফারেন্স আছে।

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

সম্পাদনা করুন - এখানে বিষয়ের উপর একটি ব্লগ পোস্ট। (সেই পোস্টের মন্তব্যে নোট করুন যা ব্যাখ্যা করে যে সি ++ আসলে পাস-বাই-রেফারেন্স রাখে না That এটি সত্য C একটি পয়েন্টার তৈরি করার অনুরোধ, বা স্পষ্টতই যখন ফাংশনগুলিতে কল করার সময় যার আর্গুমেন্ট টাইপ স্বাক্ষর করে কাজটি করার জন্য কল করে Those এগুলি মূল বিষয় যা জাভাস্ক্রিপ্ট সমর্থন করে না))


8
আপনি কোনও অবজেক্ট বা অ্যারেতে একটি রেফারেন্স পাস করতে পারেন যা আপনাকে আসল অবজেক্ট বা অ্যারে পরিবর্তন করতে দেয় যা আমি বিশ্বাস করি যে ওপি আসলে যা জিজ্ঞাসা করছে।
jਫਰ00

2
ঠিক আছে, ওপি পরিভাষাটি ব্যবহার করেছে তবে আসল কোডটি কোনও "পাসিং" জড়িত বলে মনে হচ্ছে না :-) আমি কী করতে চাইছি তা সত্যই আমি নিশ্চিত নই।
পয়েন্টি

5
একটি রেফারেন্স পাসিং মান ক্ষণস্থায়ী হিসাবে একই নয় রেফারেন্স দ্বারা , যদিও এটি যেমন এই কিছু পরিস্থিতিতে তাই প্রদর্শিত হতে পারে।
ট্র্যাভিস ওয়েব 16

5
আপনার ব্লগার সি ++, যা সম্পর্কে ভুল করে পাস-বাই-রেফারেন্স, এবং তার পোস্টে কোন জ্ঞান করে তোলে। এটি অপ্রাসঙ্গিক যে আপনি আরম্ভের পরে কোনও রেফারেন্সের মান পরিবর্তন করতে পারবেন না; 'পাস বাই রেফারেন্স' এর সাথে কিছুই করার নেই। তাঁর এই বক্তব্য যে "সিলেটের মাধ্যমে" পাসের মাধ্যমে রেফারেন্স "শনাক্ত করা যায়" তার একটি অ্যালার্ম বেল বাজানো উচিত ছিল।
EML

7
@ পয়েন্টি এটি একটি ভয়ঙ্কর উত্তর is আমার যদি সাহায্যের প্রয়োজন হয় তবে আমার শেষ জিনিসটিটি হ'ল কেউ আমাকে শব্দার্থবিদ্যার উপর স্কুল দিচ্ছে। "পাস-বাই-রেফারেন্স" এর সহজ অর্থ, "ফাংশনটি কিছুটা ডিগ্রীতে, আর্গুমেন্ট হিসাবে পাস হওয়া ভেরিয়েবলের মান পরিবর্তন করতে পারে" " (প্রশ্নের প্রসঙ্গে) এটি যতটা জটিল তা আপনি তৈরি করেননি really
মুকুটহীন

108
  1. স্ট্রিং এবং সংখ্যার মতো আদিম ধরণের ভেরিয়েবলগুলি সর্বদা মান দ্বারা পাস হয়।
  2. অ্যারে এবং অবজেক্টগুলি এই শর্তগুলির ভিত্তিতে রেফারেন্স বা মান দ্বারা পাস করা হয়:

    • আপনি যদি কোনও বস্তুর বা অ্যারের মান নির্ধারণ করে থাকেন তবে এটি পাস বাই ভ্যালু।

      object1 = {prop: "car"}; array1 = [1,2,3];

    • আপনি যদি কোনও বস্তুর বা অ্যারের সম্পত্তি মান পরিবর্তন করে থাকেন তবে এটি পাস বাই রেফারেন্স।

      object1.prop = "car"; array1[0] = 9;

কোড

function passVar(obj1, obj2, num) {
    obj1.prop = "laptop"; // will CHANGE original
    obj2 = { prop: "computer" }; //will NOT affect original
    num = num + 1; // will NOT affect original
}

var object1 = {
    prop: "car"
};
var object2 = {
    prop: "bike"
};
var number1 = 10;

passVar(object1, object2, number1);
console.log(object1); //output: Object {item:"laptop"}
console.log(object2); //output: Object {item:"bike"}
console.log(number1); //ouput: 10


21
এটি "রেফারেন্স দ্বারা পাস" এর অর্থ নয়। শব্দটির সত্যিকার অর্থে অবজেক্টগুলির সাথে কোনও সম্পর্ক নেই, তবে কলিং ফাংশন এবং কলিং পরিবেশে পরিবর্তনশীলগুলির সাথে পরামিতিগুলির মধ্যে সম্পর্কের সাথে।
পয়েন্টি

12
সবকিছু সর্বদা মান দ্বারা পাস করা হয়। অ-আদিমতার সাথে, যে মানটি পাস হয় তা হল একটি রেফারেন্স। একটি রেফারেন্সকে নির্ধারণ করা সেই রেফারেন্সকে পরিবর্তিত করে - স্বাভাবিকভাবেই, যেহেতু এটি একটি মূল্য - এবং এইভাবে মূলত উল্লেখ করা অন্য অবজেক্টটি পরিবর্তন করতে পারে না। রেফারেন্স দ্বারা নির্দেশিত বস্তুকে রূপান্তর করা আপনার প্রত্যাশার মতো ঠিক কাজ করে, পয়েন্ট-টু অবজেক্টটিকে রূপান্তরিত করে। উভয় দৃশ্যই পুরোপুরি সামঞ্জস্যপূর্ণ এবং জাভাস্ক্রিপ্ট কীভাবে সময় নিয়ে ফিরে যায় এবং কীভাবে সেটিকে ফাংশনে প্রেরণ করা হয়েছিল তা পরিবর্তন করে কীভাবে যাদুকরী পরিবর্তন হয় না।
ম্যাথু পড়ুন

9
এই উত্তরটি পূর্ববর্তীটি স্পষ্ট করে, যা এর বেশি ভোট পেয়েও (লেখার সময় এই সময়ে ২৮7 এবং এটি গ্রহণযোগ্য একটিও) জেএসের রেফারেন্স দিয়ে আসলে কীভাবে এটি পাস করতে হবে তা সম্পর্কে যথেষ্ট পরিষ্কার ছিল না। সংক্ষেপে, এই উত্তরে কোডটি কাজ করেছিল, যে উত্তরটি বেশি ভোট সংগ্রহ করেছিল তা কার্যকর হয়নি।
পাপ

25

রেফারেন্সের মতো ভেরিয়েবল পাস করার লক্ষ্যে:

var a = 1;
inc = function(variableName) {
  window[variableName] += 1;
};

inc('a');

alert(a); // 2


সম্পাদনা

হ্যাঁ, আসলে আপনি গ্লোবাল অ্যাক্সেস ছাড়াই এটি করতে পারেন

inc = (function () {
    var variableName = 0;

    var init = function () {
        variableName += 1;
        alert(variableName);
    }

    return init;
})();

inc();

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

1
@ ডক্লোক: হ্যাঁ, শেষ পর্যন্ত উইন্ডো অবজেক্টটি স্পর্শ করা দরকার - যেমন jQuery উইন্ডো ব্যবহার করে $ window / উইন্ডো.জিক্যুরি এবং অন্যান্য পদ্ধতিগুলি এর অধীনে রয়েছে। আমি বিশ্বব্যাপী নেমস্পেসের দূষণ সম্পর্কে কথা বলছিলাম যেখানে আপনি এটির সাথে একত্রিতকরণের পরিবর্তে এটিতে অনেক পরিবর্তনশীল যুক্ত করুন।
ফিল


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

11

সরল অবজেক্ট

var ref = { value: 1 };

function Foo(x) {
    x.value++;
}

Foo(ref);
Foo(ref);

alert(ref.value); // Alert: 3

কাস্টম অবজেক্ট

উদ্দেশ্য rvar

function rvar (name, value, context) {
    if (this instanceof rvar) {
        this.value = value;
        Object.defineProperty(this, 'name', { value: name });
        Object.defineProperty(this, 'hasValue', { get: function () { return this.value !== undefined; } });
        if ((value !== undefined) && (value !== null))
            this.constructor = value.constructor;
        this.toString = function () { return this.value + ''; };
    } else {
        if (!rvar.refs)
            rvar.refs = {};
        if (!context)
            context = window;
        // Private
        rvar.refs[name] = new rvar(name, value);
        // Public
        Object.defineProperty(context, name, {
            get: function () { return rvar.refs[name]; },
            set: function (v) { rvar.refs[name].value = v; },
            configurable: true
        });

        return context[name];
    }
}

পরিবর্তনশীল ঘোষণা

rvar('test_ref');
test_ref = 5; // test_ref.value = 5

বা:

rvar('test_ref', 5); // test_ref.value = 5

পরীক্ষার কোড

rvar('test_ref_number');
test_ref_number = 5;
function Fn1 (v) { v.value = 100; }
console.log("rvar('test_ref_number');");
console.log("test_ref_number = 5;");
console.log("function Fn1 (v) { v.value = 100; }");
console.log('test_ref_number.value === 5', test_ref_number.value === 5);
console.log(" ");

Fn1(test_ref_number);
console.log("Fn1(test_ref_number);");
console.log('test_ref_number.value === 100', test_ref_number.value === 100);
console.log(" ");

test_ref_number++;
console.log("test_ref_number++;");
console.log('test_ref_number.value === 101', test_ref_number.value === 101);
console.log(" ");

test_ref_number = test_ref_number - 10;
console.log("test_ref_number = test_ref_number - 10;");
console.log('test_ref_number.value === 91', test_ref_number.value === 91);

console.log(" ");
console.log("---------");
console.log(" ");

rvar('test_ref_str', 'a');
console.log("rvar('test_ref_str', 'a');");
console.log('test_ref_str.value === "a"', test_ref_str.value === 'a');
console.log(" ");

test_ref_str += 'bc';
console.log("test_ref_str += 'bc';");
console.log('test_ref_str.value === "abc"', test_ref_str.value === 'abc');

পরীক্ষার কনসোল ফলাফল

rvar('test_ref_number');
test_ref_number = 5;
function Fn1 (v) { v.value = 100; }
test_ref_number.value === 5 true

Fn1(test_ref_number);
test_ref_number.value === 100 true

test_ref_number++;
test_ref_number.value === 101 true

test_ref_number = test_ref_number - 10;
test_ref_number.value === 91 true

---------

rvar('test_ref_str', 'a');
test_ref_str.value === "a" true

test_ref_str += 'bc';
test_ref_str.value === "abc" true 

5

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

"use strict"

//return text that will reference variable by name (by capturing that variable to closure)
function byRef(varName){
    return "({get value(){return "+varName+";}, set value(v){"+varName+"=v;}})";
}

//demo

//assign argument by reference
function modifyArgument(argRef, multiplier){
    argRef.value = argRef.value * multiplier;
}

(function(){

var x = 10;

alert("x before: " + x);
modifyArgument(eval(byRef("x")), 42);
alert("x after: " + x);

})()

লাইভ নমুনা https://jsfiddle.net/t3k4403w/


এটি দুর্দান্ত
কঠোর_কাজের_আর

3

আসলে একটি সুন্দর নির্জনতা আছে:

function updateArray(context, targetName, callback) {
    context[targetName] = context[targetName].map(callback);
}

var myArray = ['a', 'b', 'c'];
updateArray(this, 'myArray', item => {return '_' + item});

console.log(myArray); //(3) ["_a", "_b", "_c"]

3

আমি ব্যক্তিগতভাবে বিভিন্ন প্রোগ্রামিং ভাষার দ্বারা প্রদত্ত "পাস বাই রেফারেন্স" কার্যকারিতা অপছন্দ করি। সম্ভবত এটি কারণ যে আমি কেবলমাত্র কার্যকরী প্রোগ্রামিংয়ের ধারণাগুলি আবিষ্কার করছি, তবে পার্শ্ব প্রতিক্রিয়া সৃষ্টিকারী ক্রিয়াকলাপগুলি (রেফারেন্স দ্বারা পাস করা প্যারামিটারগুলির মত হ'ল) ​​দেখলে আমি সর্বদা গোসাম্পস পাই। আমি ব্যক্তিগতভাবে দৃ single়ভাবে "একক দায়িত্ব" নীতিটি গ্রহণ করি।

আইএমএইচও, কোনও ফাংশনের রিটার্ন কীওয়ার্ড ব্যবহার করে কেবল একটি ফলাফল / মান দেওয়া উচিত। কোনও প্যারামিটার / যুক্তি সংশোধন করার পরিবর্তে, আমি কেবল পরিবর্তিত প্যারামিটার / যুক্তি মানটি ফিরিয়ে আনব এবং যে কোনও পছন্দসই পুনরায় নিয়োগগুলি কলিং কোড পর্যন্ত রেখে দেব।

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

উদাহরণ:

মনে করুন আর্গুমেন্ট তালিকায় 'রেফ' এর মতো একটি বিশেষ কীওয়ার্ড ব্যবহার করে প্যারামিটারগুলি সমর্থিত হবে। আমার কোডটি এর মতো দেখতে পারে:

//The Function
function doSomething(ref value) {
    value = "Bar";
}

//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar

পরিবর্তে, আমি আসলে এই জাতীয় কিছু করতে পছন্দ করব:

//The Function
function doSomething(value) {
    value = "Bar";
    return value;
}

//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar

যখন আমার একধরণের ফাংশন লিখতে হবে যা একাধিক মান প্রদান করে, আমি রেফারেন্স দ্বারা পাস হওয়া পরামিতিগুলি ব্যবহার করব না। সুতরাং আমি এই জাতীয় কোড এড়াতে হবে:

//The Function
function doSomething(ref value) {
    value = "Bar";

    //Do other work
    var otherValue = "Something else";

    return otherValue;
}

//The Calling Code
var value = "Foo";
var otherValue = doSomething(value);
console.log(value); //Bar
console.log(otherValue); //Something else

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

//The Function
function doSomething(value) {
    value = "Bar";

    //Do more work
    var otherValue = "Something else";

    return {
        value: value,
        otherValue: otherValue
    };
}

//The Calling Code:
var value = "Foo";
var result = doSomething(value);
value = result.value; //Reassignment
console.log(value); //Bar
console.log(result.otherValue);

এই কোড উদাহরণগুলি বেশ সরল, তবে এটি মোটামুটিভাবে দেখায় যে আমি ব্যক্তিগতভাবে কীভাবে এই জিনিসগুলি পরিচালনা করব। এটি আমাকে বিভিন্ন জায়গায় সঠিক জায়গায় রাখতে সহায়তা করে।

শুভ কোডিং। :)


জিনিস বরাদ্দকরণ এবং পুনরায় নির্ধারণ (কোনও প্রকারের পরীক্ষা-নিরীক্ষা ছাড়াই) হ'ল যা আমাকে গুজবাম্পস দেয়। দায়িত্ব হিসাবে, আমি প্রত্যাশা করি doome (কিছু), সেই জিনিসটি করুন, সেই জিনিসটি প্লাসটি করবেন না এবং আমার ভেরিয়েবলগুলিকে বৈশিষ্ট্যগুলিতে বরাদ্দ করুন। বলুন আমার কাছে একটি অ্যারে রয়েছে যা অনুসন্ধান করা দরকার I আমি চাইছি মিলের আইটেমগুলিকে দ্বিতীয় অ্যারেতে রাখা হয়েছে এবং আমি জানতে চাই কতগুলি পাওয়া গেছে। একটি স্ট্যান্ডার্ড সলিউশন হ'ল এইভাবে কোনও ফাংশন কল করা: 'var ;Array; if ((FindStuff (inArray, & foundArray))> 1)) // প্রক্রিয়াটি অरेরে} '। সেই দৃশ্যের কোথাও কোনও নতুন, অজানা জিনিস পছন্দসই বা প্রয়োজনীয় নয়।
এলিস ভ্যান লুইজ

@ এলিজিভেনলুইজ আপনার উদাহরণের ক্ষেত্রে, আমি findStuffকেবল ফলাফলের অ্যারেটি ফিরিয়ে দিতে পছন্দ করব । আপনিও একটি ডিক্লেয়ার করা আছে foundArrayপরিবর্তনশীল, তাই আমি সরাসরি এটি ফলের অ্যারে বরাদ্দ হবে: var foundArray = findStuff(inArray); if (foundArray.length > 0) { /* process foundArray */ }। এটি 1) কলিং কোডটিকে আরও পঠনযোগ্য / বোধগম্য করে তুলবে এবং ২) findStuffপদ্ধতির অভ্যন্তরীণ কার্যকারিতা (এবং এইভাবে টেস্টাবিলিটি) কে যথেষ্ট সরল করে তোলে, এটি বিভিন্ন (পুনরায়) ব্যবহারের ক্ষেত্রে / পরিস্থিতিগুলিতে আসলে অনেক বেশি নমনীয় করে তোলে।
বার্ট হফল্যান্ড

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

2

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

function Wrapper(val){
    this.VAL = val;
}
Wrapper.prototype.toString = function(){
    return this.VAL.toString();
}

function DECLARE(val, callback){
    var valWrapped = new Wrapper(val);    
    callback(valWrapped);
}

function INC(ref){
    if(ref && ref.hasOwnProperty('VAL')){
        ref.VAL++; 
    }
    else{
        ref++;//or maybe throw here instead?
    }

    return ref;
}

DECLARE(5, function(five){ //consider this line the same as 'let five = 5'
console.log("five is now " + five);
INC(five); // increment
console.log("five is incremented to " + five);
});

2

আসলে এটি সত্যিই সহজ,

সমস্যাটি বোঝা যাচ্ছে যে একবার ক্লাসিক তর্কগুলি পাস করার পরে, আপনি অন্য, কেবল পঠনযোগ্য জোন-এ স্থান পেয়ে যান।

সমাধানগুলি হল জাভাস্ক্রিপ্টের অবজেক্ট-ভিত্তিক নকশা ব্যবহার করে যুক্তিগুলি পাস করা,

এটি বৈশ্বিক / স্কোপড ভেরিয়েবলে আরোগ্যগুলি রাখার মতোই তবে আরও ভাল ...

function action(){
  /* process this.arg, modification allowed */
}

action.arg = [ ["empty-array"],"some string",0x100,"last argument" ];
action();

আপনি সুপরিচিত চেইন উপভোগ করতে স্টাফ আপ প্রতিশ্রুতি দিতে পারেন: প্রতিশ্রুতি মতো কাঠামো সহ পুরো জিনিস এখানে is

function action(){
  /* process this.arg, modification allowed */
  this.arg = ["a","b"];
}

action.setArg = function(){this.arg = arguments; return this;}

action.setArg(["empty-array"],"some string",0x100,"last argument")()

বা আরও ভাল .. action.setArg(["empty-array"],"some string",0x100,"last argument").call()


this.argশুধুমাত্র actionউদাহরণ দিয়ে কাজ করে । এটা কাজ করে না.
এডুয়ার্ডো কুইমো

1

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

function makeAllPretty(items) {
   for (var x = 0; x < myArray.length; x++){
      //do stuff to the array
      items[x] = makePretty(items[x]);
   }
}

myArray = new Array(var1, var2, var3);
makeAllPretty(myArray);

এখানে অন্য একটি উদাহরণ:

function inc(items) {
  for (let i=0; i < items.length; i++) {
    items[i]++;
  }
}

let values = [1,2,3];
inc(values);
console.log(values);
// prints [2,3,4]

1

জেএস শক্তিশালী ধরণের নয়, এটি আপনাকে বিভিন্নভাবে সমস্যার সমাধান করতে দেয়, যেমন এই পদক্ষেপে দেখা যাচ্ছে।

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

আপনার যদি মনে হয় যে ভেরিয়েবলগুলি রেফারেন্সের মাধ্যমে পাস করার দরকার হয় তবে আপনি আরও ভাল পরিবেশিত হতে পারেন সেগুলি আইএমএইচওতে তাদের তৈরি করা।


1

পাস-রেফারেন্স আলোচনাকে একপাশে রেখে, এখনও যারা বর্ণিত প্রশ্নের সমাধান খুঁজছেন তারা ব্যবহার করতে পারেন:

const myArray = new Array(var1, var2, var3);
myArray.forEach(var => var = makePretty(var));

0

তুমি কি বুঝাচ্ছ, তা আমি ভালই জানি. সুইফটে একই জিনিস কোনও সমস্যা হবে না। নীচে লাইন ব্যবহার করা হয় letনা var

আদিমরা মান দ্বারা পাস করা হয় তবে var iপুনরাবৃত্তির বিন্দুতে মানটি বেনামে ফাংশনে অনুলিপি করা হয় না এ বিষয়টি সত্যতা অবলম্বন করে অবাক করে বলা যায়।

for (let i = 0; i < boxArray.length; i++) {
  boxArray[i].onclick = function() { console.log(i) }; // correctly prints the index
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.