Using aliased eval and with statements in the way that you have
described here does not work in Safari and Chrome.  The code is
evaluated in the global scope instead of the local one.  If you are
relying on the code that you eval accessing the local scope, you
should use eval directly.

-- Mads

2009/9/9 Flier Lu <[email protected]>:
>
> So, my second question is, are there any method to simulate the case
> through the v8 internal API? or I must change the code to correct the
> behavior?
>
> In fact, I need a compatibility list focus on some similar issues,
> because I must align to IE and FF instead of safari. Since most of our
> users are using damned IE, I must make them happy, because they don't
> care any standard :(
>
> At least, I should know what issues have been categorized as safari
> style like this, or I can simulate part of those issues through v8
> internal API.
>
> On 9月9日, 下午2时56分, Mads Sig Ager <[email protected]> wrote:
>> Aliased eval is handled in a special way.  According to the
>> specification it would be fine to completely disallow the use of
>> aliased eval:
>>
>> Paragraph 15.1.2.1 of ECMA-262:
>>
>> "If value of the eval property is used in any way other than a direct
>> call (that is, other than by the explicit use of its name as an
>> Identifier which is the MemberExpression in a CallExpression), or if
>> the eval property is assigned to, an EvalError exception may be
>> thrown."
>>
>> In practice, webpages rely on using eval so we do not disallow it.
>> Instead, an aliased call to eval will evaluate the code in the global
>> scope.  JSC and V8 have the same behavior in this case.
>>
>> -- Mads
>>
>>
>>
>> On Wed, Sep 9, 2009 at 5:49 AM, Flier Lu<[email protected]> wrote:
>>
>> > ECMA-262 define the with statement, which could add object to the
>> > front of the scope chain.
>>
>> > For example, the following statements will return 3, because 'a' was
>> > defined in the with statement
>>
>> >>with({a:1})eval("a+2")
>> > 3
>>
>> > In the current v8 implementation (v1.3.9), if we use a alias of eval
>> > method, the with statement doesn't work
>>
>> >> var eval1=eval; with({b:1})eval1("b+2")
>> > undefined:1: ReferenceError: b is not defined
>> > b+2
>>
>> > I'm not sure whether it is ok base on design or just a implement
>> > issue?
>>
>> > 12.10 The with Statement
>> > Syntax
>> > WithStatement :
>> > with ( Expression ) Statement
>> > Description
>> > The with statement adds a computed object to the front of the scope
>> > chain of the current execution
>> > context, then executes a statement with this augmented scope chain,
>> > then restores the scope chain.
>>
>> > Semantics
>> > The production WithStatement : with ( Expression ) Statement is
>> > evaluated as follows:
>> > 1. Evaluate Expression.
>> > 2. Call GetValue(Result(1)).
>> > 3. Call ToObject(Result(2)).
>> > 4. Add Result(3) to the front of the scope chain.
>> > 5. Evaluate Statement using the augmented scope chain from step 4.
>> > 6. Let C be Result(5). If an exception was thrown in step 5, let C be
>> > (throw, V, empty), where V is the
>> > exception. (Execution now proceeds as if no exception were thrown.)
>> > 7. Remove Result(3) from the front of the scope chain.
>> > 8. Return C.
>> > NOTE
>> > No matter how control leaves the embedded 'Statement', whether
>> > normally or by some form of abrupt
>> > completion or exception, the scope chain is always restored to its
>> > former state12.10 The with Statement
>> > Syntax
>> > WithStatement :
>> > with ( Expression ) Statement
>> > Description
>> > The with statement adds a computed object to the front of the scope
>> > chain of the current execution
>> > context, then executes a statement with this augmented scope chain,
>> > then restores the scope chain.
> >
>

--~--~---------~--~----~------------~-------~--~----~
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
-~----------~----~----~----~------~----~------~--~---

Reply via email to