62

I am practicing JavaScript on Chrome's 'JavaScript Console' ( version: 35.0) and I am unable to use the 'use strict' clause as expected.

For the following code snippet :

var obj={x:1,y:2}

//Define new property with 'writable' flag as false.
Object.defineProperty(obj, "z", {value:3, writable:false, enumerable:false, configurable:false})

// Try to change the property 'z',
"use strict"; obj["z"]=4

Output: 4

As per my understanding, changing value of a 'non-writable' property will silently fail in non-strict mode and throw 'TypeError' in strict mode, But I don't see the exception.

console.log(obj)

Object {x: 1, y: 2, z: 3}

Even though the property value is not changed but I am expecting a exception. Please correct if I am doing something wrong ?

5
  • see stackoverflow.com/questions/11677452/…
    – SNAG
    Commented Jun 23, 2014 at 15:13
  • (function() {"use strict"; obj["z"]=4})(); ~ TypeError: Cannot assign to read only property 'z' of #<Object>
    – Alex K.
    Commented Jun 23, 2014 at 15:14
  • @SNAG: That has a clear answer for Firebug, but not Chrome. (Despite the title.) Which I guess makes this a duplicate of that question, except that question really only focusses (in both the question and answer) on Firebug, and really should be separate questions. Commented Jun 23, 2014 at 15:15
  • @SNAG That answer does not answer this question. This question is not a duplicate of that question.
    – user201891
    Commented Dec 2, 2015 at 0:49
  • (x=>{'use strict'; 01})() Commented May 2, 2019 at 12:25

1 Answer 1

89

The easiest way to use strict mode is to use an IIFE (immediately Invoked Function Expression) like so:

(function()
{
    'use strict';
    var foo = 123;//works fine
    bar = 345;//ReferenceError: bar is not defined
}());

To create a new-line in the console, use shift + enter, or write your code in a separate editor first, then copy-paste it to the console. Setting up a fiddle is all fine and dandy, but just test your code with the markup it was written for (ie: just clear the browser cache and test).
However, I'd urge you to install node.js, still. It's a lot easier to test your code, or validate it (both syntactically and coding-style wise) using JSHint. There are also a lot of ways to examine and your code that run out of node.js, so it's a really good development tool to have

8
  • 1
    If only there was a way to inject this into chrome developer tools as well as a "use strict" checkbox.
    – user420667
    Commented Mar 15, 2016 at 23:40
  • @user420667: That would be really tricky, because the dev tools console basically relies on eval for a lot of things, and eval + strict mode don't play nice Commented Mar 16, 2016 at 9:51
  • 1
    Although it may be obvious to some, it's worth noting that only the block of code within the IIFE will be run in strict mode. This code won't affect subsequent commands in the console.
    – shennan
    Commented Apr 26, 2018 at 17:08
  • 4
    Actually you can just write 'use strict' before your code without the need to wrap it within an IIFE.
    – Qwerty
    Commented May 16, 2018 at 18:12
  • 2
    @Shayan Honestly I am not sure whether this example in particular should return undefined. Try this 'use strict'; (function() { console.log(this)} )(). Works as expected - strict mode is applied.
    – Qwerty
    Commented Aug 9, 2022 at 18:53

Not the answer you're looking for? Browse other questions tagged or ask your own question.