jsのthis面接試験問題をまとめます.

6758 ワード

一、thisの概念
  thisとは、関数を呼び出すオブジェクトを指します.  thisはJavaScriptのキーワードで、関数が動作する時、関数の体内で自動的に生成されるオブジェクトで、関数の内部でしか使用できません.
 
1.   グローバル環境の中でthisはグローバル変数(window)を指します.
2.   関数のthisは、関数を呼び出して決定されます.
   (1)関数が独立して呼び出された場合、厳格なモードでundefinedを指し、非厳格モードではwindowを指す.
   (2)この関数があるオブジェクトによって呼び出された場合、呼び出されたオブジェクトにthisが向けられます.
3.   構造関数とプロトタイプの中のthis
     コンストラクタの中のthisと原型の中のthisのオブジェクトはすべて発生の実例です.(newで決めた)
newオペレータによってconstructorの指向を初期化することができます.newの役割はオブジェクトを作成する例です.constructorは新しい実行環境を指します.
4.  矢印関数は語法のスコープによってコンテキストを結合しますので、thisは実際に元のコンテキストに引用されます.
(矢印関数は現在のコンテキストの動作範囲をそのまま維持しますが、普通の関数ではなく、矢印関数はその動作領域からthisの値を継承します.)
 
二、例題
/*-----------   -------------------*/
           var obj = {   
                 a: 10,
                 b: this.a + 10, //   this  window(  ),a undefined  ==>  undefined + 20 = NaN
                 fn: function () {
                     return this.a;
                   }
             }
            console.log(obj.b);        //NaN
            console.log(
                obj.fn(),         //20
                obj.fn            //fn
            );     
/**-------------    ----------------*/
            var a = 20; 
            var obj = {
                a: 10,
                getA: function () {
                    return this.a;
                  }
            }
            console.log(obj.getA());    //10
            var test = obj.getA;
            console.log(test());        //20       test
 
/*-----------   -------------------*/ 
             var a = 5;
             function fn1(){
                 var a = 6;
                 console.log(a);        //6
                 console.log(this.a);   //5
             }  
             function fn2(fn) {
                 var a = 7;
                 fn();
            } 
             var obj = {
                 a: 8,
                 getA: fn1
             }  
            fn2(obj.getA); 
/*-----------   -------------------*/ 
               function fn( ) {
               'use strict';
                var a = 1;
                var obj = {
                    a: 10,
                    c: this.a + 20        //     ,a  undefined ,undefined.a  
                }
                return obj.c;
              }
             console.log(fn());       //    ==》 a undefined
 
/*-----------   -------------------*/ 
 
            //          
             function Person(name, age) {
                this.name = name;
                this.age = age;
                console.log(this);      //    this    ,  Person
            }   
            // Person();           //this   window
            Person.prototype.getName = function () {
                console.log(this);      //    this   ,  Person
            }; 
            var p1 = new Person("test", 18);
            p1.getName();
/*---------     -----*/ 
             var obj = {
               foo: "test",
               fn: function(){
                   var mine = this;
                   console.log(this.foo);       //test
                   console.log(mine.foo);       //test
                   
                   (function(){
                      console.log(this.foo);    //undefined
                      console.log(mine.foo);    //test
                   })();  
               } 
            };
            obj.fn();

              /**
                (1)       , this   mine      obj,              foo;
               (2)       ,  this    obj, this.foo            ,
                          mine      ,      ( ES5  ,     this      
                 window  ;    ES5,      this     。)
            
            */
/*  ---------     -----------  */ 
           function foo(){
                console.log(this.a);
            }
            var a = 2;
            var o = {
                a:3, 
                foo: foo
            };
            var p = { a:4 };
            o.foo();  //3
            (p.foo = o.foo)();      //2
            /**
                   : 
                function w(){
                    p.foo = o.foo;
                }
                w();
                   constructor  window,    w,  w  window    ,   
                  window.w(),  constructor  window。
            */

            p.foo = o.foo;
            p.foo();    //4        p  ,  constructor       p,       0.0
            //this    p,   this.a === p.a
 /*  ---------     -----------  */ 
 //                
            function foo() {
                console.log(this.a);
            }
            var obj1 = {
                a: 3,
                foo: foo
            };    
            var obj2 = {
                a: 5,
                foo: foo
            };
            obj1.foo();     //3
            obj2.foo();     //5
            
            obj1.foo.call(obj2);    //5
            obj2.foo.call(obj1);    //3

            // new             ,  new  call/ apply      ,  
            // new foo.call(obj1)     ,            new         
/*  ---------           -----------  */ 

          function test(arg) {
                this.x = arg;
                return this;
            } 
            /**
               var x = test(5);  -->  window.x = window.test(5);
            
            */
            var x = test(5);     //   x = window, y = undefined
            var y = test(6);     //   x = 6,  y = window ,      x        this.x    window.x
            console.log(x.x);     //undefined,       6.x   undefined
            console.log(y.x);     //6         window.x    6
/*  ---------     -----------  */ 
              var obj = {
                data: [1,2,3,4,5],
                data2: [1,2,3,4,5],
                fn: function () {
                   console.log("--test--");
                   console.log(this);   //{data: Array(5), data2: Array(5), fn: ƒ, fn2: ƒ}
                   return this.data.map(function (item) {
                         console.log(this);     //  -->  window
                         return item * 2;
                    }); 
                },
                fn2: function () {
                   console.log("---test2---");
                   console.log(this);   //{data: Array(5), data2: Array(5), fn: ƒ, fn2: ƒ}
                   return this.data2.map(item=>{
                       console.log(this);   //  --> obj {data: Array(5), data2: Array(5), fn: ƒ, fn2: ƒ}
                       return item * 2; 
                   });
                }
             };  
             obj.fn();
             obj.fn2();