জাভাস্ক্রিপ্ট ভেরিয়েবল রেফারেন্স / ওরফে


89

জাভাস্ক্রিপ্টে কোনও উপায়ে / স্থানীয় বর্ণের কোনও রেফারেন্স নির্ধারণ করা সম্ভব?

আমি সি-জাতীয় কিছু বলতে চাই:

function foo() {
  var x = 1;
  var y = &x;
  y++;
  alert(x); // prints 2 
}

= সম্পাদনা =

এই কোডটিতে আর্গুমেন্টস ক্যালি নাম দেওয়া সম্ভব ?:

function foo() {
  arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0;
  arguments.callee.myStaticVar++;
  return arguments.callee.myStaticVar;
}

4
সরল উত্তর হ'ল না। তবে আমার একটা অনুভূতি আছে যে এসও-তে থাকা কেউ এটি করতে একটি হ্যাক নিয়ে আসবে :)
আমারঘোষ

উত্তর:


173

জাভাস্ক্রিপ্টে, আদিম ধরণের যেমন পূর্ণসংখ্যা এবং স্ট্রিংগুলি মান দ্বারা পাস হয় তবে বস্তুগুলি রেফারেন্স দ্বারা পাস হয়। সুতরাং এটি অর্জন করার জন্য আপনাকে একটি অবজেক্ট ব্যবহার করতে হবে:

// declare an object with property x
var obj = { x: 1 };
var aliasToObj = obj;
aliasToObj.x ++;
alert( obj.x ); // displays 2

এটি দ্রুত ছিল =) আমি আমার ফাংশনের অভ্যন্তরে আর্গুমেন্টস ক্যালিতে একটি উপাত্ত তৈরি করতে চাই (কেবলমাত্র প্রতিটি সময় আর্গুমেন্টস.ক্যালি টাইপ করা এড়াতে)। এই পদ্ধতিতে কি এই সম্ভাবনা আছে? যদি আমি বুঝতে পারি, আমি "আর্গুমেন্টস" দিতে পারি তবে এখনও আমাকে "কলি" লিখতে হবে, তাই না?
gpilotino

9
@ ডারিন: এটি এটিকে কিছুটা প্রশংসনীয় করে তুলছে। এটি অপরিবর্তনীয় বনাম পরিবর্তনশীল প্রকারের পরিবর্তে বস্তুগুলির তুলনায় আদিম প্রকারের নয়। জাভাস্ক্রিপ্টে সমস্ত কিছু কোনও না কোনও রূপে একটি অবজেক্ট।
ক্রিসেন্ট ফ্রেশ

7
জেএসে রেফারেন্সটি মান দ্বারা পাস হয়। "পাসিং-বাই-রেফারেন্স" এবং "পাসিং-এ-রেফারেন্স-বাই-মান" এর মধ্যে পার্থক্য রয়েছে। জাভাস্ক্রিপ্টে রেফারেন্স অনুসারে প্যারামিটারগুলির পাসিং সমর্থন করা হয় না।
Corneliu

15

কিছুটা ডিগ্রি পর্যন্ত এটি সম্ভব, আপনি ক্লোজারগুলি ব্যবহার করে একটি ভেরিয়েবলের একটি উপনাম তৈরি করতে পারেন:

Function.prototype.toString = function() {
    return this();
}

var x = 1;
var y = function() { return x }
x++;
alert(y); // prints 2, no need for () because of toString redefinition 

4
আমি বিশ্বাস করি "সতর্কতা (y); // প্রিন্ট 2" হওয়া উচিত: "সতর্কতা (y ()); // প্রিন্ট 2" ফলাফল পেতে আপনাকে আসলে ফাংশনটি কল করতে হবে। খুব খারাপ, প্রস্তাবিত বাক্য গঠনটি নির্দিষ্ট পরিস্থিতিতে সহায়ক হবে।
নাথান ল্যাবেনজ

4
যে স্ট্রাস্টিং পুনরায় সংজ্ঞা একটি কারণে আছে, তাই alert(y)আসলে সঠিক। যদিও ফাংশন প্রোটোটাইপ পদ্ধতিগুলির নতুন সংজ্ঞা দেওয়া খুব খারাপ শৈলী। কিন্তু ওহে, এটা কাজ করে!
metalim

8

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

arguments.callee একটি ফাংশন, এবং সেইজন্য আপনার এটির একটি উল্লেখ থাকতে পারে এবং সেই ভাগ করা অবজেক্টটি সংশোধন করতে পারেন।

function foo() {
  var self = arguments.callee;
  self.myStaticVar = self.myStaticVar || 0;
  self.myStaticVar++;
  return self.myStaticVar;
}

মনে রাখবেন যদি উপরে কোডে আপনি বলতে ছিল self = function() {return 42;};তারপর selfতারপর একটি পড়ুন হবে বিভিন্ন বস্তু চেয়ে arguments.calleeযা একটি রেফারেন্স থাকে, foo। আপনার যখন কোনও যৌগিক অবজেক্ট থাকে, অ্যাসাইনমেন্ট অপারেটরটি রেফারেন্সটি প্রতিস্থাপন করে, এটি রেফার করা অবজেক্টটি পরিবর্তন করে না। পারমাণবিক মান সহ, একটি কেস y++সমতুল্য y = y + 1, যা ভেরিয়েবলের জন্য একটি 'নতুন' পূর্ণসংখ্যা বরাদ্দ করে।


arguments.calleeইতিমধ্যে একটি উপনাম রয়েছে যা উল্লেখ না করা , যা ফাংশনটির নাম। এই উদাহরণে আপনি কেবল ব্যবহার করতে পারেন foo.myStaticVar(সম্ভবত এটি 2009 এর আগে হয় না?)
আলজগম

2

উপর সম্প্রসারিত user187291 এর পোস্ট , এছাড়াও আপনি getters / setters ব্যবহার ফাংশন ব্যবহার করতে থাকার কাছাকাছি পেতে পারে।

var x = 1;
var ref = {
    get x()  { return x; },
    set x(v) { x = v; }
};
(ref.x)++;
console.log(x); // prints '2'
x--;
console.log(ref.x); // prints '1'

1

আমার পূর্ববর্তী উত্তরে সম্পাদনা করুন: আপনি যদি কোনও ফাংশনের আমন্ত্রণগুলি গণনা করতে চান তবে আপনি চেষ্টা করতে পারেন:

var countMe = ( function() {
  var c = 0;

  return function() {
    c++;
    return c;
  }
})();

alert(countMe()); // Alerts "1"
alert(countMe()); // Alerts "2"

এখানে, সি কাউন্টার হিসাবে কাজ করে, এবং আপনাকে আর্গুমেন্ট.ক্যালি ব্যবহার করতে হবে না।


অথবা আপনি একটি স্থিতিশীল ভেরিয়েবল ব্যবহার করতে পারেন countMe = function f(){ return ++f.c || (f.c = 1); }
aljgom

1

2019 সালে আমাকে মিনিফাইড জ্যাকোয়ারি প্লাগইন লিখতে হবে তাই আমারও এটির প্রয়োজন হয় এবং এই উদাহরণগুলি এবং অন্যান্য উত্সগুলি পরীক্ষা করে, আমি পুরো অবজেক্টের স্মৃতিতে অনুলিপি ছাড়াই একটি উপায় পেয়েছি, তবে কেবল একটি রেফারেন্স তৈরি করেছি। আমি এটি ফায়ারফক্স এবং এর আগে ফায়ারফক্সে টাস্ক ম্যানেজারের ট্যাব মেমোরি দিয়ে পরীক্ষা করেছি। কোডটি হ'ল:

var {p: d} ={p: document};
console.log(d.body);

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