The Eval function is more than just a function. Most functions only access the scope in which they are defined, but not the scope (lexical scopes) beyond.
The Eval function has the ability to access the entire scope when it is called.
When compiler writers first try to optimize JS, the Eval function makes it difficult to invoke any function efficiently, because once the function that is called is the Eval function, each function call needs to ensure that the entire scope at run time is accessible to the Eval function.
language standards evolve to identify two different ways to call Eval .
The first way: a function call involves an eval identifier, which is considered a "direct" way to invoke the Eval function. The compiler needs to ensure that the executed program has full access to the caller's local scope.
For example:
Other ways: the other way to call the Eval function is called "indirection".
The arguments to the Eval function in two ways are evaluated within the global scope.
For example: Binding the Eval function to another variable name, calling a function through the variable name causes the code to lose access to all local scopes.
The exact definition of the direct call to the Eval function depends on the ECMAScript standard rather special specification language. The only syntax that can produce a direct call to the Eval function is a variable with the name eval that may be wrapped in parentheses (many). A neat way to write an indirect call to the Eval function is to use the expression sequence operator (,) and a distinctly meaningless numeric literal.
(0,eval)(src);
How does this work?
The numeric literal 0 is evaluated but its value is ignored directly, and the result of the sequence expression represented by the parentheses is the Eval function. Thus, the behavior of (0,eval) is almost identical to the simple eval function identifier, an important difference being that the entire invocation expression is treated as a way of indirectly invoking the Eval function.
The ability to invoke the Eval function directly is easily abused.
Evaluating a source string from a network may expose its internal details to some of the untrusted ones.
Calling the Eval function directly causes the function it contains and the risk that all functions that are up to the outermost of the program are running fairly slowly.
Unless there is a clear need to examine the specific capabilities of the local scope, you should use a more inexpensive way to indirectly invoke the Eval function, which is less prone to misuse.
Tips
Wrapping the Eval function with a meaningless literal is wrapped in a sequence expression to achieve the purpose of forcing the use of an indirect call to the Eval function
Call the Eval function as indirectly as possible, rather than calling the Eval function directly.
[Effective JavaScript note] 17th: An indirect call to the Eval function is better than a direct call