Help us understand the problem. What is going on with this article?

(0, eval)('this')とは何なのか

More than 3 years have passed since last update.

はじめに

knockout.jsの冒頭のソースコードを見たとき気になる1行があった。

knockout.js
    var window = this || (0, eval)('this'), ...

この(0,eval)('this')はいったい何なのか。調べた。

調べた結果

これはindirect eval callを使用した、どのスコープでも必ずグローバルオブジェクトのthisを取得するためのテクニックであった。

ES5ではevalを直接呼び出すと、引数のコードはそのスコープで実行されるが、間接的にevalを呼び出すと、引数のコードは必ずグローバルスコープとなるそうだ。なので引数のthisは必ずグローバルオブジェクトとなる。ブラウザではwindowとなり、Nodeではglobalになるのだ。実際どうするかだが、eval関数を変数に代入し、その変数で実行すればよい。

// Nodeで実行
var obj = new (function(){
    this.direct = eval('this');
    var ev = eval;// 変数に代入
    this.indirect = ev('this');
});

console.log(obj.direct === global);//false
console.log(obj.indirect === global);//true

これを極限にまで簡略化すると(0,eval)('this')となる。カンマ演算子は左から順に評価して、最後の項目を返す。なので(0,eval)はevalを返す関数とみることができる。こういうイメージだろうか。

 (function(){ return eval;}(0))('this');

返す値は一時変数に代入されるので、そこでevalの間接参照となり、グローバルスコープで実行され、グローバルスコープのthisが取得できる。

何なのかわかったところで

実際に試すと見事グローバルスコープのthisが取得できた。

// Nodeで実行
var obj = new (function(){
    this.direct = eval('this');
    this.indirect = (0,eval)('this');
});

console.log(obj.direct === global);//false
console.log(obj.indirect === global);//true

SFPGMR
プログラミングを趣味の一つとしてます。得意分野はなく、そのとき興味を引いたものをいじって楽しんでおります。つまりすべての分野においてド素人ということです。 保有資格:普通運転免許・ネットワークスペシャリスト・情報処理第一種・第二種
http://www.sfpgmr.net/blog/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした