10780


下記ページに、「余計な変数を増やさない書き方」として

[code]

    var global = ("global",eval)("this");
    
[/code]

と書かれていますが、意味が分からないので教えてください。  
この記述でどうして別名で呼ぶことになるのでしょうか？

<http://qiita.com/Hiraku/items/d249a2f2f13532748324>

カンマ演算子は、2 番目のオペランドの値を返すから、

[code]

    var global = eval("this");
    
[/code]

？？？？

* * *

理解できないので、質問追記します。

間接的に呼び出す、という意味は、カンマ演算子を処理すると

[code]

    (evalを評価した結果)("this");
    
[/code]

となるので、

[code]

    eval("this");
    
[/code]

とは異なる、ということでしょうか？

つまり、一旦変数eに入れず、(evalを評価した結果)("this");するってこと？

evalを評価した結果は、function eval() なので、function eval()("this");と同義？

最終的には、

[code]

    eval("this");
    
[/code]

と、

[code]

    function eval()("this");
    
[/code]

の違い、ということでしょうか？


CC BY-SA 3.0
2015-05-29T23:20:06.930
10778
2015-05-31T03:50:15.530
2015-05-31T03:39:17.360
7886
7886
question
javascript
indirect eval call　で、余計な変数を増やさない書き方


`eval("this")`だと直接呼び出している。  
なので、

[code]

    var e = eval;
    var g = e("this");
    
[/code]

の様に間接的に呼び出す。  
ところで`e`は単に式の結果を格納しただけであるから  
カンマ演算子を使って式の結果になるようにすれば  
`("global",eval)("this");`  
と書いて間接的に呼び出すことになる。  
カンマ演算子の結果は最後の式ですから  
`"global"`の部分は単にダミー（なんでもよい）です。


CC BY-SA 3.0
2015-05-29T23:46:16.793
10779
2015-05-29T23:46:16.793
5044
10778
answer


[リンク先](http://qiita.com/Hiraku/items/d249a2f2f13532748324)では _別名を付ける_
とも表現されていますが、セクション名にある _indirect eval call_ を行うことが重要です。 _indirect_
はdirectの否定形ですが、ECMAScript 5では`eval`は[Direct Call](http://www.ecma-
international.org/ecma-262/5.1/#sec-15.1.2.1.1)か否かで[動作が変わる](http://www.ecma-
international.org/ecma-262/5.1/#sec-10.4.2)仕様となっているので`eval(x)`を直接呼ばない構文にしているのです。

## 質問の追記について

`eval==('global',
eval)`と試してみれば分かると思いますが、式の値としては等価だが文法上`eval(x)`という形式の直接呼出しは特別扱いをするということだと思います。


CC BY-SA 3.0
2015-05-29T23:46:29.760
10780
2015-05-31T03:50:15.530
2020-06-17T08:14:45.997
-1
5750
10778
answer