JavaScriptのthis

クイズ

以下のスクリプトで:

<?xml version="1.0"?>
<html>
  <body>
    <script language="JavaScript">
      //<!--<![CDATA[
        var name = "script";
        document.write("in script: " + this.name + "<br />"); // 1
        
        function func() {
          var name = "func";
          document.write("in  func:" + this.name + "<br />");
        }
        func(); // 2
        
        var obj = {};
        obj.name = "object"; 
        obj.func = func
        obj.func(); // 3
        
        var Class1 = function () {
          this.name = "constructor";
          this.func = func;
        };
        var obj1 = new Class1();
        obj1.func(); // 4
        
        var Class2 = function () {
        };
        Class2.prototype.name = "prototype";
        Class2.prototype.func = func;
        var obj2 = new Class2();
        obj2.func(); // 5
        //]]>-->
    </script>
  </body>
</html>

さて、コメントの位置の実行で、それぞれthis.nameは何になるでしょうか。

答え

  • 1. "script"
  • 2. "script"
  • 3. "object"
  • 4. "constructor"
  • 5. "prototype"

JavaScriptのthisは実行コンテキストによって変化します。a.f()と呼んだ場合、thisはaになるような仕組みを持っています。
ちなみにscript要素直下でのthisはwindowです。そこでのローカル変数はwindowのメンバーになるようです。