কিছু নির্দিষ্ট ফাংশন কলকে জাভাস্ক্রিপ্টে "অবৈধ অনুরোধ" বলা হয় কেন?


97

উদাহরণস্বরূপ, আমি যদি এটি করি:

var q = document.querySelectorAll;

q('body');

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

var o = Object; // which is a native code function

var x = new o();

এবং সবকিছু ঠিকঠাক কাজ করে। ডকুমেন্ট এবং কনসোল নিয়ে কাজ করার সময় বিশেষত আমি এই সমস্যাটি আবিষ্কার করেছি। কোন চিন্তা?




উত্তর:


158

কারণ আপনি কার্যটির "প্রসঙ্গ" হারিয়েছেন।

আপনি যখন ফোন করবেন:

document.querySelectorAll()

ফাংশনের প্রসঙ্গটি হ'ল documentএবং thisসেই পদ্ধতিটি প্রয়োগের মাধ্যমে অ্যাক্সেসযোগ্য হবে ।

আপনি যখন কেবল কল করবেন qতখন আর প্রসঙ্গ নেই - এর windowপরিবর্তে এটি "গ্লোবাল" অবজেক্ট।

বাস্তবায়ন querySelectorAllব্যবহারের চেষ্টা করে thisতবে এটি আর কোনও ডোম উপাদান নয়, এটি একটি Windowবিষয়। বাস্তবায়নটি কোনও ডিওএম উপাদানটির এমন কিছু পদ্ধতি কল করার চেষ্টা করে যা কোনও Windowবস্তুর অস্তিত্ব থাকে না এবং দোভাষী তারাই আশ্চর্যরূপে ফাউল বলে।

এটি সমাধানের .bindজন্য জাভাস্ক্রিপ্টের নতুন সংস্করণগুলিতে ব্যবহার করুন :

var q = document.querySelectorAll.bind(document);

যা নিশ্চিত করবে যে পরবর্তী সমস্ত অনুরোধগুলি q সঠিক প্রসঙ্গ রয়েছে। যদি না পেয়ে থাকেন তবে এটি .bindব্যবহার করুন:

function q() {
    return document.querySelectorAll.apply(document, arguments);
}

4
ওহ, ভাল কল। আপনি ঠিক বলেছেন কারণ আমি এটি করতে পারি: q.apply (ডকুমেন্ট, ['বডি']); এবং এটি কাজ করে।
ব্যবহারকারী 1152187

মনে রাখবেন যে এটি IE এ বিল্টিন ফাংশনগুলির জন্য প্রয়োজনীয় কাজ করে না। উদাহরণস্বরূপ, কনসোল.লগের সেখানে প্রয়োগের পদ্ধতি নেই।
hugomg

@Alnitak: হাঁ, এটা আইই ছাড়া সর্বত্র কাজ করে এবং কেন আপনি প্রায়ই শুধু normaly আর্গুমেন্ট পাস করা উচিত, হিসাবে function q(x){ return document.querySelectorAll(x); }। আই ব্রাউজারের অবজেক্ট সম্পর্কে আমি সত্যিই পছন্দ করি এমন অন্যটি হ'ল আপনি যদি তাদের কাছ থেকে কোনও সম্পত্তি পড়ার চেষ্টা করেন তবে তাদের মধ্যে কিছু একটি ব্যতিক্রম ছুঁড়ে ফেলেছে, তাই আপনার if( 'funcname' in browserobject)স্বাভাবিক পরিবর্তে বৈশিষ্ট্যগুলি পরীক্ষা করা দরকার if(browserobject.funcname)!
hugomg

দুর্দান্ত উত্তর, আমি এই ঘটনায় সত্যই বিভ্রান্ত হয়েছিলাম, ওপি-র মতো একই অবস্থা।
অস্থায়ী_ ব্যবহারকারী_নাম

4
মন ফুঁকছে। ধন্যবাদ.
আরবি-

1

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


ভেরিয়েবল ঘোষণার ফলে এই বিশেষ ক্ষেত্রে কোনও অর্থ হবে না কারণ ডোম নির্ভরশীল পদ্ধতিটি ডিওএমের প্রেক্ষাপটের বাইরে ডেকে আনা হচ্ছে, কারণ আপনি যে মুহুর্তে Q = ডকুমেন্ট somethingকরেন।এই পদ্ধতিটি নথির প্রসঙ্গে হারায়
আনশুল সাহনি


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