programing

Node.js REPL에 있는 함수를 )(로 호출하는 이유는 무엇입니까?

newstyles 2023. 9. 11. 21:31

Node.js REPL에 있는 함수를 )(로 호출하는 이유는 무엇입니까?

node.js로 테스트한 자바스크립트에서 함수를 호출할 수 있는 이유는 무엇입니까?

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

왜 마지막 전화가hi)(, 작동합니까? node.js의 버그, V8 엔진의 버그, 공식적으로 정의되지 않은 동작, 또는 실제로 모든 인터프리터에 유효한 자바스크립트입니까?

REPL이 입력을 평가하는 방식에 기인하며, 궁극적으로는 다음과 같습니다.

(hi)()

식이 되도록 추가 괄호 추가됩니다.

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

치료하는 것이 목적입니다.{...}~하듯이Object블록으로서라기보다는 문학/문학자

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

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

그리고 leesei가 언급했듯이, 이것은 모든 입력이 아닌 만 하는 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';
  }

Node REPL 버그인 것 같습니다. 이 두 줄을 A에 넣었습니다..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)
> 

4개월 전에 이 문제로 인해 버그가 발생했습니다. https://github.com/joyent/node/issues/5698

그리고 문제는 REPL이 문장을 부모님과 함께 동봉하기 때문에.

foo)(

된다

(foo)()

실제 설명은 여기 https://github.com/joyent/node/issues/5698#issuecomment-19487718 에서 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/19310788/why-does-calling-a-function-in-the-node-js-repl-with-work