Bu Node.js ile ÇOĞALTMA) bir işlev çağırarak neden( iş? | Netgez.com
SORU
11 EKİM 2013, Cuma


Bu Node.js ile ÇOĞALTMA) bir işlev çağırarak neden( iş?

Neden böyle bir JavaScript işlevini çağırmak için mümkün, node.js ile test edilmiştir:

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

Neden son çağrı, hi)(, çalışıyor mu? Tüm çevirmenlere node.js V8 motoru hata, resmen tanımsız davranış, ya da aslında geçerli bir JavaScript hata mı?

CEVAP
11 EKİM 2013, Cuma


ÇOĞALTMA sonuçta olan giriş, değerlendirir nasıl olabilir:

(hi)()

Ek parantez to force it to be an Expression eklendi:

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

Niyet block Object/initialisers harfleri yerine {...} tedavi etmektir.

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

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

Ve leesei belirtildiği gibi, bu 0.11 için değiştirildi.17* *tüm giriş yerine hangi 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';
  }

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ★ByScrapi★ Designs

    ★ByScrapiâ

    27 AÄžUSTOS 2013
  • BgirlNilaya

    BgirlNilaya

    29 EKİM 2008
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007