3

When I run this code in Chrome, I get an Uncaught TypeError: Cannot read property 'concat' of undefined

function _log()
{
    'use strict'

    [this].concat(Array.from(arguments)).forEach(
        function (obj) { console.log(obj) }
    )
}

_log('foo', 'bar');

I don't understand why this is happening. How can [this] be undefined? Even if this were undefined, [this] should still be an array, shouldn't it?

A funny detail is that when I remove the use strict line from the function, the error disappears and the code behaves as expected, logging the function context and arguments each on a new line.

Is there maybe something special about using the keyword this in strict mode which I'm not aware of?

Thanks.

Lynn
  • 423
  • 4
  • 10

1 Answers1

7

This is a fun bug:

You just forgot the semicolon after 'use strict', which totally changes how the code is parsed:

'use strict'[this].concat...

You're taking the property named "[Object window]" in the 'use strict' chain. Of course it's undefined, so it doesn't have any property called "concat".

Denys Séguret
  • 372,613
  • 87
  • 782
  • 758