Wednesday 15 May 2013

variables - 'JavaScript for PHP Developers -> The Built-In API -> The Global Object': cannot reproduce code in browser -



variables - 'JavaScript for PHP Developers -> The Built-In API -> The Global Object': cannot reproduce code in browser -

the book javascript php developers contains next commented code (to i've added alert()s display values of single-variable-expression statements of form

variable;

and have added 'use strict' directive see if causing problem. cannot reproduce code on jsfiddle firefox. i've added own comments code in big caps:

'use strict'; // create global variable var john = "jo"; alert(john); // "jo" alert(window.john); // "jo", works property /* undefined here */ // create property of global object window.jane = "jj"; alert(jane); // "jj", works variable alert(window.jane); // "jj" // delete them alert(delete window.john); // false /* true here */ alert(delete window.jane); // true alert(john); // "jo" alert(jane); // undefined /* programme crashes here */ alert(this === window); // true

in fact in following little program lastly alert function phone call never reached:

window.jane = "jj"; delete window.jane; alert(jane); // programme crashes alert('got here');

i've tested cases 1 more time here illustrates cases.

var = 'john'; window.b = 'jane'; c = 'jack'; alert(a); // john alert(b); // jane alert(c); // jack alert(window.a); // undefined alert(window.b); // jane alert(window.c); // jack alert(delete a); // false alert(delete b); // true alert(delete c); // true alert(a); // john //alert(b); // crash //alert(c); // crash window.b = 'jane'; c = 'jack'; alert(delete window.a); // true alert(delete window.b); // true alert(delete window.c); // true alert(window.a); // undefined alert(window.b); // undefined alert(window.c); // undefined alert(a); // john //alert(b); // crash //alert(c); // crash

what want know is, behavior consistent across browsers or differences between 1 browser , another. code book error or run against different browser own (firefox 33.0.1)?

if explain various cases, perhaps pointing relevant sections of ecma specification, appreciated.

thanks.

ok, results seeing such because have run code in jsfiddle within onload function , not @ global scope, pointed out. here result of running comprehensive test within web page served local machine. results on jsfiddle script within body html element same:

<!doctype html> <html> <head> <title></title> </head> <body> <script type="text/javascript"> var = 'john'; window.b = 'jane'; c = 'jack'; alert(a); // john alert(b); // jane alert(c); // jack alert(window.a); // john alert(window.b); // jane alert(window.c); // jack alert(delete a); // false alert(delete b); // true alert(delete c); // true alert(a); // john seek { alert(b); } grab (e) { alert(e); } // throws referenceerror: b not defined seek { alert(c); } grab (e) { alert(e); } // throws referenceerror: c not defined window.b = 'jane'; c = 'jack'; alert(delete window.a); // false alert(delete window.b); // true alert(delete window.c); // true alert(window.a); // john alert(window.b); // undefined alert(window.c); // undefined alert(a); // john seek { alert(b); } grab (e) { alert(e); } // throws referenceerror: b not defined seek { alert(c); } grab (e) { alert(e); } // throws referenceerror: c not defined </script> </body> </html>

and here happens when ecmascript5 'use strict' directive used. while i'm aware declaring variable without var in strict mode causes reference error i'm not sure can create sense of rest of output, in particular why script execution terminate @ places:

<!doctype html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <script type="text/javascript"> 'use strict'; var = 'john'; window.b = 'jane'; seek { c = 'jack'; } grab (e) { alert(e); } // throws referenceerror: assignment undeclared variable c alert(a); // john alert(b); // jane seek { alert(c); } grab (e) { alert(e); } // throws referenceerror: c not defined alert(window.a); // john alert(window.b); // jane alert(window.c); // undefined seek { // uncommenting of these 3 next statements cause script exited // during parsing time; no statement script executed. //alert(delete a); causes script end during parsing @ runtime though seek grab block nowadays //alert(delete b); causes script end during parsing @ runtime though seek grab block nowadays //alert(delete c); causes script end during parsing @ runtime though seek grab block nowadays } grab (e) { alert(e); } alert(a); // john seek { alert(b); } grab (e) { alert(e); } // jane seek { alert(c); } grab (e) { alert(e); } // throws referenceerror: c not defined window.b = 'jane'; c = 'jack'; seek { //alert(delete window.a); // causes script end during execution @ runtime though seek grab block nowadays //alert(delete window.b); // causes script end during execution @ runtime though seek grab block nowadays //alert(delete window.c); // causes script end during execution @ runtime though seek grab block nowadays } grab (e) { alert(e); } /* script stops execution @ point. why????? alert(window.a); // alert(window.b); // alert(window.c); // alert(a); // seek { alert(b); } grab (e) { alert(e); } // seek { alert(c); } grab (e) { alert(e); } // </script> </body> </html>

if can help me interpreting why script executions terminate in places way strict mode appreciated.

thanks.

with regards origninal code book, when run within script tag in head of document, next output, can see referenceerror instance due accessing variable jane thrown. here jsfiddle code:

//'use strict' // create global variable var john = "jo"; alert(john); // "jo" alert(window.john); // "jo", works property // create property of global object window.jane = "jj"; alert(jane); // "jj", works variable alert(window.jane); // "jj" // delete them seek { alert(delete window.john); } grab (e) { alert(e); } // false /* if strict mode enforced cause next fatal error: typeerror: property "john" non-configurable , can't deleted */ seek { alert(delete window.jane); } grab (e) { alert(e); } // true alert(john); // "jo" seek { alert(jane); } grab (e) { alert(e); } // undefined in book /* gives a: referenceerror: jane not defined fatal error causing script exit if not caught*/ alert(this === window); // true

look @ part of interface jsfiddle:

that "onload" selector means code type javascript quadrant of interface wrapped in function you, , that function serve "load" event handler window. because code in function, variables declare @ appears global level aren't global; they're local variables in function.

to create code global, alter selection 1 of "no wrap" settings.

javascript variables global-variables scope global

No comments:

Post a Comment