[webkit-dev] Timer callback and 'this' object
Sam Weinig
sam.weinig at gmail.com
Mon Dec 1 19:23:09 PST 2008
Hi Dmitry,
The first example using a closure executes in the parent scope because
functions execute in lexical scope regardless of where they are called from,
capturing variables as required. The string version is simply executed as a
program by the caller and has no knowledge of the scope in which it was
declared. This is a bit strange, but follows the conventions of the
language. As for the test, tests are always welcomed, especially for odd
edges like this.
-Sam
On Mon, Dec 1, 2008 at 8:08 PM, Dmitry Titov <dimich at chromium.org> wrote:
> Hi webkit-dev,
>
> I'm looking at JS timeout code and found a callback behavior that seems
> strange. Not sure if it is intentional.
> If timeout is set on a 'window' object from another frame and timeout
> callback is specified as a JS string, it is executed "inside the frame"...
> So the context of execution is different depending how the callback is
> specified.
>
> Here is html (also attached) that loads an empty IFRAME and sets 2 timeouts
> on that iframe's window - as a JS closure and as JS string. In former case,
> the callback runs in the main page (expected, since the JS closure
> 'captures' the context in which it is defined), in the latter- inside iframe
> (a bit weird?). So the text goes in both "body" elements.
>
> Is there a reason why JS string is evaluated in the inner context of the
> iframe? Would a test verifying this behavior be a good thing? Curiously, IE
> and FF behave the same way.
>
> <html>
> <script>
> function test() {
> // Get the iframe's window.
> var iframeWindow = window.frames["testIframe"];
>
> // setTimeout with a closure as callback.
> iframeWindow.setTimeout(
> function() {
> if (!document.body)
> document.write('<body></body>');
> document.body.appendChild(document.createTextNode('Timer 1
> fired.'));}, 1);
>
> // setTimeout with a JS string containing similar code.
> iframeWindow.setTimeout(
> "if (!document.body)" +
> " document.write('<body></body>');" +
> "document.body.appendChild(document.createTextNode('Timer 2
> fired.'));", 1);
> }
> </script>
> <body onLoad="test();">
> <iframe src="about:blank" id="testIframe"></iframe>
> </body>
> </html>
>
>
> Thanks,
> Dmitry
>
> _______________________________________________
> webkit-dev mailing list
> webkit-dev at lists.webkit.org
> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-dev/attachments/20081201/f24f7692/attachment.html>
More information about the webkit-dev
mailing list