-
-
Save tsaniel/1264086 to your computer and use it in GitHub Desktop.
| function(){ | |
| /* Rules: // make sure | |
| (1) anonymous function // to annotate | |
| (2) optionally self-executing // your code | |
| (3) <140 bytes // so everyone | |
| (4) no global vars // can learn | |
| (5) MIT license // from it! | |
| (6) good luck! | |
| */} |
| function(){/*Rules: (1) anonymous function (2) optionally self-executing (3) <140 bytes (4) no global vars (5) MIT license (6) good luck!*/} |
| { | |
| "name": "sample", | |
| "keywords": [ "sample", "original" ] | |
| } |
You can even eliminate the toString call completely, because .test() coerces its first argument into String.
You could try a&&a.alert additionally
@atk: Thanks again! But an fake object {alert:1,toString:function(){return 'w]'}} still passes the test.
That's true. How about (a||0).constructor===this.Window? Works in all modern browsers (not in IE 7 or older).
Not in Chrome 14.
this.constructor !== window
Damn, there it's DOMWindow... /Wi/.test(a.constructor), maybe?
{constructor:'Wi'}
Let's try this:
function(a,b){b=this.Window||this.DOMWindow;return!!a&&b?a instanceof b:a==(b=a.document)&&b!=a}
It is sad that it won't work with iframes...
Rewritten to probably work with (i)frames:
function(a,b){return!!a&&(b=a.Window||a.DOMWindow)?a instanceof b:a==(b=a.document)&&b!=a}
It cannot work with my chromium 12...
Alas, it's not exposed in Chrome. OK, let's try this:
function(a,b){return!!a&&(b=top.constructor)?a instanceof b:a==(b=a.document)&&b!=a}
It won't work with (i)frame as well, because the scope of top differs from (i)frame.
Right. Any idea how to get DOMWindow in Chrome if its not exposed?
The magic __proto__?
Doesn't help very much, because it is different between frames.
I think it is hard. In fact, the original code is enough.
Try this:
function(a,b){return a&&a==a[b='window']&&a==a[b][b]}
Clever. Exploiting the fact that any global object is exposed as a property of window, and window itself is a global object.
@phoetry: It's clever but it won't work.
var a = {};
a.window = a;
(function(a,b){return a&&a==a[b='window']&&a==a[b][b]})(a) // true
I'd say it's safe to eliminate the Object {} scope from the toString() call.