1// Copyright 2008 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28// const variables should be read-only 29const c = 42; 30c = 87; 31assertEquals(42, c); 32 33 34// const variables are not behaving like other JS variables when it comes 35// to scoping - in fact they behave more sanely. Inside a 'with' they do 36// not interfere with the 'with' scopes. 37 38(function () { 39 with ({ x: 42 }) { 40 const x = 7; 41 } 42 x = 5; 43 assertEquals(7, x); 44})(); 45 46 47// const variables may be declared but never initialized, in which case 48// their value is undefined. 49 50(function (sel) { 51 if (sel == 0) 52 with ({ x: 42 }) { 53 const x; 54 } 55 else 56 x = 3; 57 x = 5; 58 assertTrue(typeof x == 'undefined'); 59})(1); 60 61 62// const variables may be initialized to undefined. 63(function () { 64 with ({ x: 42 }) { 65 const x = undefined; 66 } 67 x = 5; 68 assertTrue(typeof x == 'undefined'); 69})(); 70 71 72// const variables may be accessed in inner scopes like any other variable. 73(function () { 74 function bar() { 75 assertEquals(7, x); 76 } 77 with ({ x: 42 }) { 78 const x = 7; 79 } 80 x = 5 81 bar(); 82})(); 83 84 85// const variables may be declared via 'eval' 86(function () { 87 with ({ x: 42 }) { 88 eval('const x = 7'); 89 } 90 x = 5; 91 assertEquals(7, x); 92})(); 93