Strict Mode

by Joshua McNeese

JavaScript

"use strict";

var foo = "test";
function test(){}
 
// deleting variables or functions throw errors
//delete foo;
//delete test;
 
function test2(arg) {
    // deleting arguments throw errors
    //delete arg;
}

// duplicate variables or keys throw errors
var bar = { foo: true, /* foo: false */ };

// attempts to assign a value to baz where baz hasn’t been defined will fail
baz = 0;

// virtually any attempt to use 'eval' throw errors
var eval = 0;
function eval(){}
function test(eval){}
function(eval){}
new Function("eval");

// attempts to create a new var via eval are blocked
eval("var a = false;");
print( typeof a ); // undefined

// attempts to overwrite arguments throw errors
function() {
     arguments = [0,1,2];   
}

/*
Any attempts to write to a property whose writable attribute is set to false, delete a property whose configurable attribute is set to false, or add a property to an object whose extensible attribute is set to false will result in an error. 
*/