কেন নোড.জেএসআরইপিএল এর সাথে একটি ফাংশন কল করা (কাজ)?


191

নোড.জেএস দিয়ে পরীক্ষিত জাভাস্ক্রিপ্টে এভাবে ফাংশন কল করা কেন সম্ভব:

~$ node
> function hi() { console.log("Hello, World!"); };
undefined
> hi
[Function: hi]
> hi()
Hello, World!
undefined
> hi)( // WTF?
Hello, World!
undefined
>

কেন শেষ কল hi)(, কাজ করে? এটি কি নোড.জেজে বাগ, ভি 8 ইঞ্জিনে বাগ, আনুষ্ঠানিকভাবে সংজ্ঞায়িত আচরণ, বা সমস্ত দোভাষীদের জন্য আসলে বৈধ জাভাস্ক্রিপ্ট?


1
উবুন্টু 13.04 এ নোডেজ v0.6.19-এ পুনরুত্পাদনযোগ্য
এমভিপি

1
jsfiddle.net এ একটি দ্রুত পরীক্ষা আপনাকে দেখায় যে এটি অবৈধ জাভাস্ক্রিপ্ট।
ক্রিস্টোফ

6
একটি নোড REPL বাগ হিসাবে মনে হচ্ছে, দুটি লাইন রেখে .jsদিলে সিনট্যাক্স ত্রুটির কারণ হবে
1313

8
BTW, ক্রেডিট যেখানে এটি কারণে, এই পর্যন্ত IRC (FreeNode #nodejs) এ এসে দ্বারা @miniml,
হাইড

3
পার্ল অনেক একই কারণে অনুরূপ কিছু আছে: perl -ne '$x += $_; }{ print $x'পার্লের লুকানো বৈশিষ্ট্যগুলি
অ্যাড্রিয়ান প্রোঙ্ক

উত্তর:


84

একটি নোড REPL বাগ হিসাবে মনে হচ্ছে, এই দুটি লাইন রেখে .jsদিলে সিনট্যাক্স ত্রুটির কারণ হবে।

function hi() { console.log("Hello, World!"); }
hi)(

ত্রুটি:

SyntaxError: Unexpected token )
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3

ইস্যু জমা দেওয়া হয়েছে # 6634

V0.10.20 এ পুনরুত্পাদন করা হয়েছে।


v0.11.7 এটি স্থির করে আছে।

$ nvm run 0.11.7
Running node v0.11.7
> function hi() { console.log("Hello, World!"); }
undefined
>  hi)(
SyntaxError: Unexpected token )
    at Object.exports.createScript (vm.js:44:10)
    at REPLServer.defaultEval (repl.js:117:23)
    at REPLServer.b [as eval] (domain.js:251:18)
    at Interface.<anonymous> (repl.js:277:12)
    at Interface.EventEmitter.emit (events.js:103:17)
    at Interface._onLine (readline.js:194:10)
    at Interface._line (readline.js:523:8)
    at Interface._ttyWrite (readline.js:798:14)
    at ReadStream.onkeypress (readline.js:98:10)
    at ReadStream.EventEmitter.emit (events.js:106:17)
> 

27
তারা আসলে এগিয়ে গিয়ে তা ঠিক করে দিয়েছে? আহ, করুণা, আমি এটি দেখতে চাই এটি একটি সংস্কৃতি শুরু করে এবং সমস্ত ভাষায় একটি বৈশিষ্ট্য হয়ে উঠেছে । আমি কতবার টাইপ করেছি) (তাড়াতাড়ি () এর পরিবর্তে ... :))
জিওমাগাস

18
@ জিওগাস আপনি কি ভাবেন function a)arg1, arg2( } ]arg2 + arg1[ return; {যে বৈধ বাক্য গঠন হবে?
Azz

40
না সত্যিই না. আসলে, এটি একটি রসিকতা ছিল।
জিওমাগাস

7
একসময় DWIM বিকল্পের সাথে একটি লিস্প বাস্তবায়ন ছিল যা ভুল বানান এবং অন্যান্য ছোটখাটো ত্রুটি স্বয়ংক্রিয়ভাবে সংশোধন করে। en.wikipedia.org/wiki/DWIM
Barmar

2
@ জিওমাগাস, ভাল, কিছু ইতিমধ্যে এগিয়ে গিয়েছে এবং এটি সম্পর্কে চিন্তা করেছে - npmআছে install এবং আছে isntall । বাজি আপনি খেয়াল করেন নি :)
এলিরান মালকা

201

এটি কীভাবে আরএপিএল ইনপুটটিকে মূল্যায়ন করে, তার পরিণামটি এইভাবে:

(hi)()

এটিকে এক্সপ্রেশন হিসাবে বাধ্য করতে অতিরিক্ত বন্ধনী যুক্ত করা হয়েছে :

  // First we attempt to eval as expression with parens.
  // This catches '{a : 1}' properly.
  self.eval('(' + evalCmd + ')',
      // ...

অভিপ্রায় আচরণ হয় {...}যেমন Objectলিটারেল / initialisers বদলে যেমন ব্লক

var stmt = '{ "foo": "bar" }';
var expr = '(' + stmt + ')';

console.log(eval(expr)); // Object {foo: "bar"}
console.log(eval(stmt)); // SyntaxError: Unexpected token :

এবং, লেসেই যেমন উল্লেখ করেছেন, এটি 0.11.x এর জন্য পরিবর্তন করা হয়েছে, যা সমস্ত ইনপুটের পরিবর্তে কেবল{ ... } মোড়বে :

  if (/^\s*\{/.test(evalCmd) && /\}\s*$/.test(evalCmd)) {
    // It's confusing for `{ a : 1 }` to be interpreted as a block
    // statement rather than an object literal.  So, we first try
    // to wrap it in parentheses, so that it will be interpreted as
    // an expression.
    evalCmd = '(' + evalCmd + ')\n';
  } else {
    // otherwise we just append a \n so that it will be either
    // terminated, or continued onto the next expression if it's an
    // unexpected end of input.
    evalCmd = evalCmd + '\n';
  }

19
hi)(argতার মানে কি কাজ করবে? যে কিছু সত্যিই ডব্লিউটিএফ-পড়া কোড ;-) লিখতে নির্যাতিত যেতে পারে
ডক্টর জোন্স

আমি এখনও বুঝতে পারছি না যে কেন এটি চলবে। মেলে না এমন খোলা পেরেনের কারণে এটি একটি সিনট্যাক্স ত্রুটি করে না?
পিটার ওলসন

2
hi)(argহয়ে যায় (hi)(arg)- কোনও মিল নেই
শীটজেএস

60

এই সমস্যাটির জন্য 4 মাস আগে একটি বাগ উত্থাপিত হয়েছিল https://github.com/joyent/node/issues/5698

আর সমস্যাটি কারণ, REPL প্যারেনগুলির সাথে বিবৃতিগুলি আবদ্ধ করে। সুতরাং

foo)(

হয়ে

(foo)()

আসল ব্যাখ্যা এখানে পাওয়া যাবে https://github.com/joyent/node/issues/5698#issuecomment-19487718


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