[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