(1, ইভাল) ('এই') বনাম ইওভায়েল ('এটি') জাভাস্ক্রিপ্টে?


85

আমি জাভাস্ক্রিপ্ট প্যাটার্ন পড়া শুরু করি , কিছু কোড আমাকে বিভ্রান্ত করে।

var global = (function () {
    return this || (1, eval)('this');
}());

আমার প্রশ্নগুলি এখানে:

প্র 1:

(1, eval) === eval?

কেন এবং কিভাবে এটি কাজ করে?

প্রশ্ন 2: কেন শুধু নয়

var global = (function () {
    return this || eval('this');
}());

বা

 var global = (function () {
    return this;
}());

আমি শিরোনাম আপডেট করেছি কারণ এটি একটি নির্দিষ্ট ক্ষেত্রে। এছাড়াও, নির্দিষ্ট ধরণের বন্ধনীর জন্য প্রথম বন্ধনী : [] এবং {

উত্তর:


104

(1,eval)পুরানো এবং সাদামাটা পুরানো মধ্যে পার্থক্যটি evalহ'ল পূর্বেরটি একটি মান এবং পরেরটি একটি মূল্যবান ue এটি যদি আরও কিছু সনাক্তকারী হয় তবে এটি আরও স্পষ্ট হবে:

var x;
x = 1;
(1, x) = 1; //  syntax error, of course!

এটি (1,eval)এমন একটি অভিব্যক্তি যা ফল দেয় eval(ঠিক যেমনটি বলুন, (true && eval)বা (0 ? 0 : eval)হবে) তবে এটি কোনও রেফারেন্স নয় eval

আপনি যত্ন কেন?

ওয়েল, একমা বৈশিষ্ট একটি বিবেচনা করে রেফারেন্স থেকে evalএকটি "সরাসরি Eval কল" হতে, কিন্তু একটি অভিব্যক্তি যে নিছক উৎপাদনেরeval প্রত্যক্ষ ও পরোক্ষ Eval কল বিশ্বব্যাপী সুযোগ চালানো নিশ্চিত হয় - একটি পরোক্ষ এক পরিণত হয়।

আমি এখনও যে জিনিসগুলি জানি না:

  1. কোন পরিস্থিতিতে সরাসরি স্পষ্ট কল বিশ্বব্যাপী সুযোগে কার্যকর হয় না ?
  2. কোন পরিস্থিতিতে thisবিশ্বব্যাপী সুযোগে কোনও ক্রিয়াকলাপ বিশ্বব্যাপী বস্তুটি উত্পাদন করতে পারে না ?

আরও কিছু তথ্য এখানে আটকানো যেতে পারে ।

সম্পাদনা

স্পষ্টতই, আমার প্রথম প্রশ্নের উত্তর হ'ল "প্রায় সর্বদা"। সরাসরি evalথেকে, executes বর্তমান সুযোগ। নিম্নলিখিত কোড বিবেচনা করুন:

var x = 'outer';
(function() {
  var x = 'inner';
  eval('console.log("direct call: " + x)'); 
  (1,eval)('console.log("indirect call: " + x)'); 
})();

আশ্চর্যজনকভাবে (হি-হেই) নয়, এটি প্রিন্ট করে:

direct call: inner
indirect call: outer

সম্পাদনা

আরও পরীক্ষার পরে, আমি অস্থায়ীভাবে বলতে যাচ্ছি যে thisসেট করা যায় না nullবা undefined। এটি অন্যান্য মিথ্যা মানগুলিতে (0, '', NaN, মিথ্যা) সেট করা যেতে পারে তবে কেবল খুব ইচ্ছাকৃতভাবে।

আমি বলতে যাচ্ছি যে আপনার উত্সটি একটি হালকা এবং বিপরীতমুখী ক্র্যানিও-মলদ্বার বিপরীতে ভুগছে এবং হাস্কেলের একটি সপ্তাহের প্রোগ্রামিংয়ে কাটাতে বিবেচনা করতে পারে।


4
বাহ, পুরো valueবনাম lvalueজিনিসটি জানত না (ভাল, অনুশীলনে সম্ভবত, তবে কথায় নয়)। না ES5 এর বিধি বিধিগুলি (এমন নয় যে আমার পক্ষে যুক্তিসঙ্গতভাবে evalকখনও ব্যবহার করা উচিত )। ধন্যবাদ!
স্টিভ

হ্যাঁ, evalপ্রচুর দুষ্টু ধারালো প্রান্ত রয়েছে এবং কেবলমাত্র একটি শেষ অবলম্বন হিসাবে ব্যবহার করা উচিত এবং তারপরে খুব খুব সাবধানে।
মালভোলিও

আমি কেবল একবার বৈধ ব্যবহারের innerHtml
মুখোমুখি হয়েছি

4
সরাসরি মূল্য নির্ধারণের সাথে লভালুতে সামান্য পরিমাণ থাকে কারণ এটি সাধারণত কোনও অ্যাসাইনমেন্টের বাম দিকে প্রদর্শিত হতে পারে এমন অভিব্যক্তিকে বোঝায়, সুতরাং নামটি মূল্যকে বিপরীতে হিসাবে চিহ্নিত করে। খালি কলটি কেবলমাত্র অনুমানের 15.1.2.1.1 এ তালিকাভুক্ত শর্তের অধীনে সরাসরি রয়েছে যা বলে যে শনাক্তকারী অবশ্যই evalএকটি কলএক্সপ্রেসের সদস্যপদ অংশ হতে হবে এবং মানটি উল্লেখ করবেeval ফাংশনটি করে।
চকজ

4
@ মালভোলিও আপনি বোঝাচ্ছেন যে প্রত্যক্ষ বনাম পরোক্ষ প্রমাণের সাথে লভ্যুয়েলের কিছু আছে যা তারা না করে। evalএকটি কল এক্সপ্রেশন লক্ষ্য হিসাবে পরিচিত একটি সনাক্তকারী ব্যবহার বিশেষ। আপনি বলেছেন যে ইসিএমএ বিশেষ উল্লেখের সাথে আচরণ evalকরে যা এটি দেয় না। এটি কল এক্সপ্রেশনে প্লেসমেন্ট যা বিশেষ যা অভিব্যক্তিটি স্ট্যান্ডার্ড evalফাংশনকে মূল্যায়ন করে। উদাহরণস্বরূপ, var eval = window.eval; eval('1');এখনও সরাসরি প্রত্যক্ষদর্শী এবং window.eval('1')এটি এ ক্ষেত্রেও লভ্যালু হলেও এটি নয়।
চকজ

33

খণ্ড,

var global = (function () {  
    return this || (1, eval)('this');  
}());  

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

এ 1: পরোক্ষ আয়াত সরাসরি কল করার আশেপাশের বিশেষ নিয়মের কারণে এক (1, eval)('this')নয় ।eval('this')eval

এ 2: আসলটি কঠোর মোডে কাজ করে, পরিবর্তিত সংস্করণগুলি তা করে না।


12

প্রশ্নোত্তর:

আমি মনে করি এটি জেএসে কমা অপারেটরের একটি ভাল উদাহরণ। আমি এই নিবন্ধটিতে কমা অপারেটরের জন্য ব্যাখ্যাটি পছন্দ করতে চাই: http://javascriptweblog.wordpress.com/2011/04/04/the- জাভাস্ক্রিপ্ট- comma-operator/

কমা অপারেটর তার অপারেশনগুলির উভয়কে (বাম থেকে ডানে) মূল্যায়ন করে এবং দ্বিতীয় অপারেন্ডের মান প্রদান করে।

প্রশ্নোত্তর:

(1, eval)('this')পরোক্ষ ইওল কল হিসাবে বিবেচিত হয়, যা ES5 তে বিশ্বব্যাপী কোড কার্যকর করে। সুতরাং ফলাফল বিশ্বব্যাপী প্রসঙ্গ হবে।

Http://perfectionkills.com/global-eval- কি-are-the-options/#evaling_in_global_scope দেখুন


7

প্রশ্ন 1: একাধিক পরপর জাভাস্ক্রিপ্ট বিবৃতি কমা দ্বারা পৃথক করা শেষ বিবৃতিটির মান গ্রহণ করে। সুতরাং:

(1, eval)ফাংশনের একটি ফাংশন রেফারেন্স যা সর্বশেষের মান নেয় eval()। এটি স্পষ্টতই eval()কলটি একটি পরোক্ষ ইভাল কল হিসাবে কল করার জন্য এটি করেছে যা ES5 এর বিশ্বব্যাপী পরিমাপে মূল্যায়ন করা হবে। বিশদ এখানে ব্যাখ্যা করা হয়েছে

প্রশ্ন 2: অবশ্যই এমন কিছু পরিবেশ থাকতে হবে যা গ্লোবাল সংজ্ঞায়িত করে না this, তবে সংজ্ঞা দেয় eval('this')। এ জন্যই আমি ভাবতে পারি।


সম্ভবত কেউ চেক-ইন হুকটিকে ডজ করার চেষ্টা করছে যা অস্বীকার করে না /eval\(/g?
স্টাইভ

@ স্টাইভ - হ্যাঁ আমিও এরকম কিছু নিয়ে ভাবছিলাম। যদি চেকিন হুক না হয় তবে কিছু প্রক্রিয়াতে কোথাও ফিল্টার করে (সম্ভবত ছোট করা হবে)।
jਫਰ00 4

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


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