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 29 const c = 42; 30 c = 87; 31 assertEquals(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