Brian Terlson wrote:
20 sites, however, will likely be broken by this change in some way.
There is also a chance that the tool used to identify breakages has
missed some code that will breka.
Below are some examples of code on the web today that will be broken.
For each I include a snippet of code that is heavily edited in an
attempt to convey the pattern used and the developer intent. I also
attempt to identify what functionality will actually be broken.
Thanks for the snippets. Some questions interspersed below.
Most of the breakages occur in non-library code, with two exceptions:
qTip 1.0, and thickbox 3.
# http://ninemsn.com.au
RenderModal = function () {
if (x) { // is an array of shortcuts that can be added. Is statically
non-empty.
function K() {
// process the array of shortcuts in some way
}
}
K();
};
Since x evaluates as truthy no matter what (even an empty array is an
object, therefore truthy), this is equivalent to
RenderModal = function () {
function K() {
// process the array of shortcuts in some way
}
K();
};
but of course it lies outside of ES6's function-in-block semantics, yet
still in the intersection of Firefox and IE/IE-emulating-browsers.
# http://yandex.ru
if (_ycssjs("BaH0Fmmo2Sg24lRmTPrK0B8qpaA")) {
function cp(g, c, d) { /* ...*/ }
function csh_ifgsid(c, b) { /*...*/ } }
// ... thousands of lines of code ...
This "then" block presumably closes here, before:
if (_ycssjs("rO+QIoSf2L0NwDn6vjJjy+27nxI")) {
function news() {
csh_if_gsid();
}
}
if (_ycssjs("YRPF0QVjJmhRiKRu6cvi3YXqYo8")) {
// ... bunch of stuff ...
cp();
}
Somehow the "if" conditions are logically connected such that no calls
to an undefined identifier occur! Blech.
## Scenario
Unknown
Indeed! Cc'ing Chaals in case he can shed light.
# http://g.espncdn.com/nfl-primetime-payoff/en/module/entry?matchupid=478
if (isIE && isWin) {
// ...
} else {
function JSGetSwfVer(i){
// ...
}
}
function checkFlash(myRev) {
// ...
if (isIE && isWin) {
// ...
} else {
aV = JSGetSwfVer(rV);
}
}
## Scenario
Can’t find a page which uses this code.
Can you say how many of the 20 cases involve actual live code using the
function-in-pre-ES6-block code?
# http://www.t-online.de
if (!Adition_Environment) {
var Adition_Environment = (function () {
var _this = {};
// ...
_this.getPrf = function (cuId) {
var prf = "";
try {
prf = Adition_Prfstr(cuId);
} catch (e) { }
return prf;
};
// ...
})();
}
// snip 1k lines
if (typeof Adition_Prfstr == "undefined") {
function Adition_Prfstr(ADITION_CONTENTUNIT_ID) {
// ...
}
}
## Scenario
Required to display advertisements on the page.
Heinous.
# http://manormystery.com
if (!window._ate) {
window._ate = { /* ... */ };
function addthis_open() { /* ... */ } } else { _ate.inst++; }
Did you snip the closing brace for the "then" block left open, the one
for "if (!window._ate)"?
if (_atc.abf) {
addthis_open(document.getElementById("ab"), "emailab",
window.addthis_url || "[URL]", window.addthis_title || "[TITLE]"); }
## Scenario
Social sharing popups broken at least. This may be a general utility
used in a number of places.
On the other hand, the snippet seems like a mis-coding of
if (!window._ate) {
window._ate = { /* ... */ };
}
function addthis_open() { /* ... */ } } else { _ate.inst++; }
if (_atc.abf) {
addthis_open(document.getElementById("ab"), "emailab",
window.addthis_url || "[URL]", window.addthis_title || "[TITLE]"); }
...
}
I'd try to evangelize the owner of this code.
# http://manhunt.net (NSFW, DO NOT VISIT AT WORK)
/** @todo isFlashInstalled() should probably be gotten by include from
js/cmmn/flashDetect.js or upfunc.js. */
if (typeof isFlashInstalled == 'undefined') {
function isFlashInstalled() {
var requiredMajorVersion = 6; // Major version of Flash required
var requiredMinorVersion = 0; // Minor version of Flash required
var requiredRevision = 0; // Minor version of Flash required
var s = new SWFObject();
if (!s) return false;
var version = s.installedVer;
if (!version) return false;
return (version.major >= requiredMajorVersion && version.minor >=
requiredMinorVersion && version.rev >= requiredRevision);
}
}
isFlashInstalled();
Here is the simplest example of a pre-ES6 Firefox/IE+clones
intersection: function-in-block with hoisting to top of outer function
or global scope *and* SpiderMonkey's assignment-like runtime binding
both work the same, provided the use(s) of the function's name all occur
after any such assignment (in the SpiderMonkey in Firefox scenario).
There's no control flow relation in general, e.g. dominance. However in
this case the "if (typeof isFlashInstalled == 'undefined')" head could,
to a sufficiently smart CFG analyzer, imply that isFlashInstalled()
post-dominates some kind of "definition" of that name.
Ok, enough so far to say a few things:
1. We have time and (among the bigs involved in ES6) try evangelization.
Evangelization can be crowd-sourced too, and can be more effective when
done that way.
2. We have some terrible choices, even if ES6's function-in-block
semantics require "use strict". That leaves the above mess a de-facto
standard which has never been specified. Specifying the sloppy-mode
intersection is going to be ugly and a time-sink.
3. The carrot of function-in-block may be sweet -- we have evidence in
all the good sites your crawl found that are not the insane 20 -- but
whether "use strict"; required before all such ES6 function-in-block
uses would be a stick remains to be investigated. Did you check for "use
strict" or actual enabled-in-IE10 strict mode among the sites you found
that declare functions in blocks?
/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss