সুযোগের সমস্ত পরিবর্তনশীল প্রাপ্তি Get


194

জাভাস্ক্রিপ্টের স্কোপগুলিতে থাকা সমস্ত ভেরিয়েবলগুলি পাওয়ার কি কোনও উপায় আছে?


ক্যামসোফ্টকে আপনার উত্তর দিন: এটি সম্পূর্ণ আলাদা প্রশ্ন; আমি আমার উত্তর আপডেট করার জন্য এটি ঠিকানা।
টিজে ক্রাউডার

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

আপনি গ্লোবাল ভেরিয়েবল বলতে চাইছেন! আপনি ব্যবহার করে প্রচুর পরিমাণে বৈশ্বিক ভেরিয়েবল প্রদর্শন করতে পারেন for (v in this) alert(v);। যদিও সমস্ত গ্লোবালগুলি অগণনীয় নয় এবং অ-গণনাযোগ্যদের তালিকা পাওয়ার কোনও মানক উপায় আমি জানি না।
জেসন ওরেডরফ

2
@ জেসন - না, প্রশ্নটি পরিষ্কার। একটি ফাংশন ভিতরে স্কোপ গ্লোবাল ভেরিয়েবল অন্তর্ভুক্ত হবে this, arguments, পরামিতি এবং সুযোগ পরিক্ষেপ সংজ্ঞায়িত সব ভেরিয়েবল।
টিম ডাউন

2
এই কারণেই আমি পার্লের প্রতীক টেবিলগুলি মিস করি। এটি জাভাস্ক্রিপ্টের ভবিষ্যতে প্রকাশে যুক্ত করার কোনও পরিকল্পনা?
অক্সিজেন

উত্তর:


84

নং "স্কোপ" ভেরিয়েবলগুলি "স্কোপ চেইন" দ্বারা নির্ধারিত হয় যা প্রোগ্রামিয়ালি অ্যাক্সেসযোগ্য নয়।

বিশদর জন্য (এর বেশিরভাগ অংশ), ECMAScript (জাভাস্ক্রিপ্ট) নির্দিষ্টকরণ পরীক্ষা করে দেখুন। এখানে অফিশিয়াল পৃষ্ঠার একটি লিঙ্ক রয়েছে যেখানে আপনি ক্যানোনিকাল স্পেক (একটি পিডিএফ) ডাউনলোড করতে পারেন এবং এখানে একটি সরকারী, লিঙ্কযোগ্য HTML সংস্করণে একটি।

ক্যামসফটে আপনার মন্তব্যের ভিত্তিতে আপডেট করুন Update

আপনার ইভেন্ট ফাংশনটির সুযোগের ভেরিয়েবলগুলি আপনার ইভেন্ট ফাংশনটি কোথায় সংজ্ঞায়িত করে তা নির্ধারণ করা হয়, তারা এটি কীভাবে ডাকে না। তবে , thisকেনেনিটিএম নির্দেশ করেছেন ( for (var propName in ____)) যেটি আপনাকে সরবরাহ করা বিভিন্ন অবজেক্টে ( thisএবং আর্গুমেন্ট; আপনি যদি সরবরাহ করেন তবে কী পাওয়া যায়) এর লাইন ধরে কিছু করার মাধ্যমে আপনার ফাংশনটিতে আর আর্গুমেন্টের মাধ্যমে কী পাওয়া যায় সে সম্পর্কে দরকারী তথ্য পেতে পারেন you 're তারা আপনাকে কী আর্গুমেন্ট দেয় তা নিশ্চিত নন, আপনি argumentsপ্রতিটি ফাংশনের জন্য সুস্পষ্টভাবে সংজ্ঞায়িত ভেরিয়েবলের মাধ্যমে জানতে পারেন )।

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

var n, arg, name;
alert("typeof this = " + typeof this);
for (name in this) {
    alert("this[" + name + "]=" + this[name]);
}
for (n = 0; n < arguments.length; ++n) {
    arg = arguments[n];
    alert("typeof arguments[" + n + "] = " + typeof arg);
    for (name in arg) {
        alert("arguments[" + n + "][" + name + "]=" + arg[name]);
    }
}

(আরও দরকারী তথ্য পেতে আপনি এটিতে প্রসারিত করতে পারেন))

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


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

4
@ সুইভেলগেমস: ওহ, আমি ফায়ারফক্স + ফায়ারব্যাগের চেয়ে Chrome এর দেব সরঞ্জামগুলিকে অনেক বেশি পছন্দ করি। তারা কেবল ২০১০ সালে খুব বেশি পিছিয়ে ছিল না: :-)
টিজে ক্রোডার

1
পছন্দ করুন আমি লক্ষ্য করেছি উত্তরটির টাইমস্ট্যাম্পটি কিছুক্ষণ আগে হয়েছিল :)
সুইভেল

98

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

এই ফাংশনটি বিবেচনা করুন:

var f = function() {
    var x = 0;
    console.log(x);
};

আপনি আপনার ফাংশনটিকে স্ট্রিংয়ে রূপান্তর করতে পারেন:

var s = f + '';

আপনি একটি স্ট্রিং হিসাবে ফাংশন উত্স পাবেন

'function () {\nvar x = 0;\nconsole.log(x);\n}'

ফাংশন কোডটি পার্স করতে এবং স্থানীয় ভেরিয়েবলের ঘোষণার সন্ধান করতে এখন আপনি এসপ্রিমার মতো পার্সার ব্যবহার করতে পারেন ।

var s = 'function () {\nvar x = 0;\nconsole.log(x);\n}';
s = s.slice(12); // to remove "function () "
var esprima = require('esprima');
var result = esprima.parse(s);

এবং এর সাথে অবজেক্টগুলি সন্ধান করুন:

obj.type == "VariableDeclaration"

ফলাফলে (আমি console.log(x)নীচে সরিয়েছি ):

{
    "type": "Program",
    "body": [
        {
            "type": "VariableDeclaration",
            "declarations": [
                {
                    "type": "VariableDeclarator",
                    "id": {
                        "type": "Identifier",
                        "name": "x"
                    },
                    "init": {
                        "type": "Literal",
                        "value": 0,
                        "raw": "0"
                    }
                }
            ],
            "kind": "var"
        }
    ]
}

আমি এটি ক্রোম, ফায়ারফক্স এবং নোডে পরীক্ষা করেছি।

তবে এই পদ্ধতির সমস্যাটি হ'ল আপনার কেবলমাত্র ফাংশনেই ভেরিয়েবলগুলি সংজ্ঞায়িত করা হয়েছে। উদাহরণস্বরূপ এটির জন্য:

var g = function() {
    var y = 0;
    var f = function() {
        var x = 0;
        console.log(x);
    };
}

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


7
মূল সমস্যাটি মোকাবেলায় দুর্দান্ত কৌশল। একটি upvote প্রাপ্য।
গভীরতা

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

আপনি দয়া করে "একটি সাধারণ ইওল" পরিষ্কারটি ব্যাখ্যা করতে পারেন? আমি নীচে কোড দিয়ে চেষ্টা করেছি কিন্তু সুযোগে ভেরিয়েবল আটকাতে পারিনি। function getCounter(start){ return function(){ start ++; return start; } } var counter = getCounter(1); var startInClosure = eval.call(counter, 'this.start;'); console.log(startInClosure);এটি মুদ্রণের undefinedসময় আমি আশা করি এটি 2 হওয়া উচিত
পাইলিপালা

@ পাইলিপালা এখানে প্রশ্নটি সুযোগের বাইরে থেকে স্থানীয় ভেরিয়েবলের মান না পাওয়ায় স্কোরের ভেরিয়েবল সম্পর্কে। এটি সম্ভব নয়, কারণ এটি স্থানীয় ভেরিয়েবলের সংজ্ঞা যা বাইরে থেকে অ্যাক্সেসযোগ্য নয়। আপনার কোড সম্পর্কিত, আপনার অর্থ প্রসঙ্গটি নয় স্কোপ নয় তবে আপনি প্রসঙ্গে (এটি) শুরু করেন নি, তাই আপনি এটিটি স্টার্ট দিয়ে পড়তে পারবেন না । এখানে দেখুন: paste.ubuntu.com/11560449
ইমান

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

32

হ্যা এবং না. প্রায় প্রতিটি পরিস্থিতিতে "না"। "হ্যাঁ," তবে আপনি যদি বিশ্বব্যাপী সুযোগ পরীক্ষা করতে চান তবে কেবল একটি সীমিত পদ্ধতিতে। নিম্নলিখিত উদাহরণটি ধরুন:

var a = 1, b = 2, c = 3;

for ( var i in window ) {
    console.log(i, typeof window[i], window[i]);
}

150++ অন্যান্য জিনিসের মধ্যে কোনটি আউটপুট দেয়:

getInterface function getInterface()
i string i // <- there it is!
c number 3
b number 2
a number 1 // <- and another
_firebug object Object firebug=1.4.5 element=div#_firebugConsole
"Firebug command line does not support '$0'"
"Firebug command line does not support '$1'"
_FirebugCommandLine object Object
hasDuplicate boolean false

সুতরাং বর্তমান স্কোপটিতে কিছু ভেরিয়েবলের তালিকা তৈরি করা সম্ভব, তবে এটি নির্ভরযোগ্য, সংক্ষিপ্ত, দক্ষ বা সহজে অ্যাক্সেসযোগ্য নয়।

একটি ভাল প্রশ্ন আপনি কেন ভেরিয়েবল সুযোগ আছে তা জানতে চান?


2
আমি মনে করি প্রশ্নটি আরও সাধারণ ছিল এবং কোনও ওয়েব ব্রাউজারের প্রসঙ্গে জাভাস্ক্রিপ্টের মধ্যে সীমাবদ্ধ ছিল না।
রাদু সিমিনেস্কু

আপনি যদি নোড ব্যবহার করেন তবে "গ্লোবাল" এর জন্য "উইন্ডো" শব্দটি পরিবর্তন করুন ... বা আপনি "এটি" শব্দটি ব্যবহার করতে পারেন তবে এটি "কঠোরভাবে ব্যবহার করুন" এর আওতায় নিষিদ্ধ
ইভান ক্যাস্তেলানানোস

আমি hasnOnProperty- এর জন্য একটি লাইন চেক যোগ করেছি। উদাহরণস্বরূপ: for ( var i in window ) { if (window.hasOwnProperty(i)) { console.log(i, window[i]); }}। এটি অন্তত উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যগুলি কেটে ফেলবে এবং আপনার ভেরিয়েবলগুলি প্রায় 50 টির মতো বৈশিষ্ট্যগুলির মধ্যে থাকবে।
টিম্বট্রান

8
ডিবাগিং এবং / বা বিকাশের উদ্দেশ্যে কেউ কেন কমপক্ষে কমপক্ষে ভেরিয়েবলের সুযোগ রয়েছে তা যাচাই করতে চাইবে না।
অক্সিজেন

স্থানীয় স্কোপগুলিতে ভেরিয়েবলগুলি কী কী তা জানতে চাওয়ার আর একটি কারণ হ'ল বন্ধের সিরিয়ালাইজ করা।
মাইকেল 25

29

ইসমাস্ক্রিপ্ট a-তে withএকটি প্রক্সি অবজেক্টের সাহায্যে স্টেটমেন্টের অভ্যন্তরে কোডটি গুটিয়ে রাখা কম-বেশি সম্ভব । নোট করুন এটির জন্য অ-কঠোর মোড দরকার এবং এটি খারাপ অভ্যাস।

function storeVars(target) {
  return new Proxy(target, {
    has(target, prop) { return true; },
    get(target, prop) { return (prop in target ? target : window)[prop]; }
  });
}
var vars = {}; // Outer variable, not stored.
with(storeVars(vars)) {
  var a = 1;   // Stored in vars
  var b = 2;   // Stored in vars
  (function() {
    var c = 3; // Inner variable, not stored.
  })();
}
console.log(vars);

প্রক্সিটি অভ্যন্তরে রেফারেন্সযুক্ত সমস্ত সনাক্তকারীদের মালিকানা দাবি করে with, তাই পরিবর্তনশীল অ্যাসাইনমেন্টগুলি লক্ষ্যবস্তুতে সংরক্ষণ করা হয়। অনুসন্ধানের জন্য, প্রক্সি প্রক্সি লক্ষ্য বা গ্লোবাল অবজেক্ট (প্যারেন্ট স্কোপ নয়) থেকে মানটি পুনরুদ্ধার করে। letএবংconst ভেরিয়েবল অন্তর্ভুক্ত করা হয় না।

বার্গির এই উত্তর দ্বারা অনুপ্রাণিত ।


1
এটি একটি সাধারণ কৌশল জন্য আশ্চর্যজনকভাবে সফল।
জোনাথন ইউনিস

ওয়াও সুপার পাওয়ার
পেরি মিমন

16

আপনি পারবেন না।

ভেরিয়েবল, ফাংশন ঘোষণার সনাক্তকারী এবং ফাংশন কোডের জন্য আর্গুমেন্টগুলি ভেরিয়েবল অবজেক্টের বৈশিষ্ট্য হিসাবে আবদ্ধ , যা অ্যাক্সেসযোগ্য নয়।

আরো দেখুন:


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

Bclary.com- এ লিঙ্কগুলির জন্য +1। ECMA ওয়েবসাইটে পরবর্তী কয়েক মাসের মধ্যে আপ-টু-ডেট স্পিকের একটি এইচটিএমএল সংস্করণ প্রকাশিত হবে, আমি খুশি বলে খুশি।
টিজে ক্রাউডার

3
শুধু একটি নোট, উভয় লিঙ্ক ভাঙা।
0xc0de

আপনি পারবেন - স্থির বিশ্লেষণ সহ jsfiddle.net/mathheadinclouds/bvx1hpfn/11
mathheadinclouds

8

একটি বিশেষ ক্ষেত্রের মধ্যে ভারতে অ্যাক্সেস পাওয়ার সহজতম উপায়

  1. বিকাশকারী সরঞ্জামসমূহ> সংস্থানসমূহ (ক্রোমে) খুলুন
  2. এমন সুযোগে অ্যাক্সেস রয়েছে এমন কোনও ফাংশন সহ ফাইলটি খুলুন (ফাইলটি সন্ধান করার জন্য টিপ সেন্টিমিডি / সিআরটিএল + পি)
  3. এই ফাংশনের ভিতরে ব্রেকপয়েন্টটি সেট করুন এবং আপনার কোডটি চালান
  4. এটি যখন আপনার ব্রেকপয়েন্টে থামে, আপনি কনসোলের মাধ্যমে স্কোপ ভেরি অ্যাক্সেস করতে পারেন (বা স্কোপ ভার উইন্ডো)

দ্রষ্টব্য: আপনি আন-মিনিফাইড জেএস এর বিপরীতে এটি করতে চান।

সমস্ত বেসরকারী ভার্সাল দেখানোর সহজ উপায়

  1. কনসোল খুলুন (ক্রোমে)
  2. প্রকার: this.window
  3. প্রবেশ করুন

এখন আপনি একটি অবজেক্ট ট্রি দেখতে পাবেন যা আপনি সমস্ত ঘোষিত বস্তুর সাথে প্রসারিত করতে পারেন।


7

সবাই যেমন খেয়াল করেছেন: আপনি পারবেন না। তবে আপনি একটি আপত্তি তৈরি করতে পারেন এবং যে ভ্যারিকে আপনি সেই আপত্তিটি ঘোষণা করেন তা নির্ধারণ করতে পারেন। আপনি সহজেই আপনার ভারগুলি পরীক্ষা করে দেখতে পারেন:

var v = {}; //put everything here

var f = function(a, b){//do something
}; v.f = f; //make's easy to debug
var a = [1,2,3];
v.a = a;
var x = 'x';
v.x = x;  //so on...

console.log(v); //it's all there

1
দুর্দান্ত উদাহরণের জন্য +1 ধন্যবাদ, কেবলমাত্র সমাপ্তির জন্য একই console.log(window); jsfiddle.net/4x3Tx- এর
স্ট্যানো

5

আমি byমানের দ্বারা বর্ণিত উপরের ধারণাগুলির উপর ভিত্তি করে একটি বেসরকারী বাস্তবায়ন করেছি (মূলত)। আপনি যখন দ্বিতীয় ipsum উপর মাউস করেন তখন এটি কেমন দেখাচ্ছেreturn ipsum*ipsum - ...

এখানে চিত্র বর্ণনা লিখুন

সুযোগে থাকা ভেরিয়েবলগুলি হাইলাইট করা হয় যেখানে তারা ঘোষিত হয় (বিভিন্ন স্কোপের বিভিন্ন বর্ণ সহ)। দ্যloremলাল সীমানা সহ একটি ছায়াযুক্ত পরিবর্তনশীল (না সুযোগ কিন্তু সুযোগ হতে আরও গাছটা অন্যান্য চালিত সেখানে হবে না তাহলে।)

আমি জাভাস্ক্রিপ্ট, এবং ইস্ট্র্রাভার্স, এসকোডিজেন, এস্কোপ (এস্প্রিমার শীর্ষে ইউটিলিটি লাইব্রেরিগুলি) পার্স করার জন্য এসপ্রিমা গ্রন্থাগারটি ব্যবহার করছি heavy 'ভারী উত্তোলন' libra সমস্ত লাইব্রেরি দ্বারা করা হয়েছে (অবশ্যই সবচেয়ে জটিল হ'ল এস্প্রিমা নিজেই, অবশ্যই।)

কিভাবে এটা কাজ করে

ast = esprima.parse(sourceString, {range: true, sourceType: 'script'});

বিমূর্ত সিনট্যাক্স ট্রি তোলে। তারপর,

analysis = escope.analyze(ast);

প্রোগ্রামের সমস্ত স্কোপ সম্পর্কে তথ্য encapsulating একটি জটিল তথ্য কাঠামো উত্পাদন করে। বাকিরা সেই বিশ্লেষণ অবজেক্টে (এবং বিমূর্ত সিনট্যাক্স ট্রি নিজেই) এনকোড করা তথ্য একত্রিত করছে এবং এর থেকে একটি ইন্টারেক্টিভ রঙিন স্কিম তৈরি করছে।

সুতরাং সঠিক উত্তরটি আসলে "না" নয়, "হ্যাঁ, তবে"। "তবে" বড় হ'ল: আপনাকে মূলত জাভাস্ক্রিপ্টে ক্রোম ব্রাউজারের (এবং এটি ডেভলগুলি) উল্লেখযোগ্য অংশগুলি আবার লিখতে হবে। জাভাস্ক্রিপ্ট একটি টুরিং সম্পূর্ণ ভাষা, অবশ্যই এটি নীতিগতভাবে সম্ভব। যা অসম্ভব তা হ'ল আপনার উত্স কোডের সম্পূর্ণতা ব্যবহার না করে (স্ট্রিং হিসাবে) এবং তারপরে এটি অত্যন্ত জটিল জিনিসগুলি করা।


3

আপনি যদি ডিবাগটিতে সহায়তা করার জন্য ভেরিয়েবলগুলি নিজেই পরীক্ষা করতে চান, তবে ডিবাগারটি সরিয়ে দিন:

debugger;

সরাসরি ব্রাউজার কনসোল into

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