| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- var echo = WScript.Echo;
- var x0 = 0;
- echo("Nested in function expression");
- (function(){
- var x1 = 1;
- function f1() {
- var x11 = 11;
- echo(x0, x1, x11, typeof f1);
- }
- f1();
- function f2(a2) {
- echo(a2, arguments[0], typeof arguments, typeof f1);
- }
- f2("a2");
- })();
- echo();
- echo("Nested in function expression with arguments");
- (function(a0){
- var x1 = 1;
- function f1() {
- echo(x0, x1, a0, typeof f1);
- }
- f1();
- })("a0");
- echo();
- echo("Nested in named function expression, hidden and unhidden");
- (function f(a0){
- var x1 = 1;
- function f1() {
- echo(typeof f, x0, x1, a0, typeof f1);
- }
- f1();
- })("a0");
- (function f(a0, f){
- var x1 = 1;
- function f1() {
- echo(typeof f, x0, x1, a0, typeof f1);
- }
- f1();
- })("a0");
- echo();
- echo("Nested in function expression with eval");
- (function(a0){
- eval("x1 = 1; var x2 = 2");
- function f1() {
- echo(x0, x1, x2, a0, typeof f1);
- }
- f1();
- try {
- // Make sure global-eval-scoped functions work right in ES6
- WScript.Echo(eval('let x; function z() { return z; } z();'));
- } catch(e) {}
- })("a0");
- echo();
- echo("Nested in _named_ function expression");
- (function f0(){
- var x1 = 1;
- function f1() {
- var x11 = 11;
- echo(x0, x1, x11, typeof f1, typeof f0);
- }
- f1();
- function f2(a2) {
- echo(a2, arguments[0], typeof arguments, typeof f1, typeof f0);
- }
- f2("a2");
- })();
- echo();
- echo("Nested in _named_ function expression with arguments");
- (function f0(a0){
- var x1 = 1;
- function f1() {
- echo(x0, x1, a0, typeof f1, typeof f0);
- }
- f1();
- })("a0");
- echo();
- echo("Nested in _named_ function expression with eval");
- (function f0(a0, a1){
- eval("x1 = 1; var x3 = 3");
- var x2 = 2;
- function f1() {
- echo(x0, x1, x2, x3, a0, a1, typeof f1, typeof f0);
- }
- f1();
- })("a0", "a1");
- echo();
- echo("Deeply nested");
- (function f0(a0, a1){
- eval("x1 = 1");
- var x2 = 2;
- function f1(af1) {
- function f2() {
- echo(x0, x1, x2, a0, a1, af1, typeof f1, typeof f0);
- }
- f2();
- }
- f1("af1");
- })("a0", "a1");
- echo();
- echo("Deeply nested func expr");
- (function f0(a0, a1){
- eval("x1 = 1");
- var x2 = 2;
- (function(){
- (function(){
- function f3() {
- echo(x0, x1, x2, a0, a1, typeof f0);
- }
- f3();
- })();
- })();
- })("a0", "a1");
- echo();
- echo("Parent func has arguments");
- (function() {
- function foo(a, b) {
- echo(arguments, typeof bar);
- function bar(){}
- }
- foo(1,2);
- })();
- //-------------------------- eval ---------------------------
- var x = "global";
- geval = eval;
- echo("Child calls eval");
- (function(){
- var x = "local";
- function f1(af1) {
- eval("echo(x)");
- }
- f1();
- })();
- echo("Deeply nested child calls eval");
- (function(){
- var x = "local";
- function f1() {
- function f2() {
- (function(){
- function f4() {
- eval("echo(x)");
- }
- f4();
- })();
- }
- f2();
- }
- f1();
- })();
- echo("Child calls (eval)");
- (function(){
- var x = "local";
- function f1() {
- (eval)("echo(x)");
- }
- f1();
- })();
- echo("Child calls (,eval)");
- (function(){
- var x = "local";
- function f1() {
- (1,eval)("echo(x)");
- }
- f1();
- })();
- echo("Child calls geval");
- (function(){
- var x = "local";
- function f1() {
- geval("echo(x)");
- }
- f1();
- })();
- echo("Child calls leval");
- (function(){
- var x = "local";
- function f1() {
- var leval = eval;
- function f2() {
- leval("echo(x)");
- }
- f2();
- }
- f1();
- })();
- echo("Parent in strict mode, child eval syntax error");
- (function(){
- "use strict";
- function f0() {
- function f1() {
- eval("arguments = 42;");
- }
- f1();
- };
- try {
- f0();
- } catch (e) {
- echo(e); // expect syntax error for "arguments = 42"
- }
- })();
- echo();
- //----------------- with -------------------
- var a = "global";
- var b = "global";
- var x = {a:"with"};
- echo("func inside with is not deferred");
- with (x) {
- var f1 = function() {
- function f2() {
- echo(a, b);
- }
- f2();
- };
- f1();
- }
- echo("simple with (no outer symbol access)");
- (function(){
- function f0() {
- with (x) {
- var f1 = function() {
- echo(a, b);
- };
- f1();
- }
- }
- f0();
- })();
- echo("simple access from with");
- (function(){
- var a = "local";
- var b = "local";
- function f0() {
- with (x) {
- echo(a, b);
- }
- }
- f0();
- })();
- echo("call func from with");
- (function () {
- var obj = {};
- function foo() {
- echo("foo");
- }
- function bar() {
- with (obj) {
- foo();
- }
- }
- bar();
- })();
- echo("call self from with");
- (function() {
- var i = 0;
- function foo() {
- echo("foo", i++);
- if (i > 0) {
- return;
- }
- with (x) {
- foo();
- }
- }
- foo();
- })();
- echo();
- //----------------- try/catch -------------------
- echo("parent is catch scope");
- (function(){
- try {
- echo(no_such_var);
- } catch(e) {
- // This is inside catch, should not be deferred.
- (0, function(){
- echo(e);
- })();
- }
- })();
- echo("parent func contains catch scope");
- (function(){
- function f0() {
- try {
- echo(no_such_var);
- } catch(e) {
- echo(no_such_var);
- }
- // This can be deferred
- (0, function() {
- })();
- }
- try {
- f0();
- } catch(e) {
- echo(e);
- }
- })();
- echo("parent func contains catch scope and eval");
- (function(){
- function f0() {
- eval("");
- try {
- echo(no_such_var);
- } catch(e) {
- echo(no_such_var);
- }
- // This can be deferred
- (0, function() {
- })();
- }
- try {
- f0();
- } catch(e) {
- echo(e);
- }
- })();
- echo();
- echo("Win8 540999: arguments identifier used as parameter");
- (function () {
- function foo() {
- function unwrapArguments(arguments) {
- for (var i = 0; i < arguments.length; i++) {
- echo(arguments[i]);
- }
- }
- function bar() {
- unwrapArguments();
- }
- bar();
- }
- try {
- foo();
- } catch (e) {
- echo(e);
- }
- })();
- echo();
- echo("Win8 649401: Same named parameters + eval");
- (function () {
- function foo(x, x, x, x, x, x) {
- function bar() { };
- eval('echo("x:", x)'); // eval
- }
- foo(0);
- foo(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
- })();
- echo();
- echo("Win8 649401: Same named parameters + arguments");
- (function () {
- function foo(x, x, x, x, x, x) {
- function bar() { };
- echo("x:", x);
- for (var i = 0; i < arguments.length; i++) {
- echo(arguments[i]);
- }
- }
- foo(0);
- foo(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
- })();
|