this指向题目

107 阅读2分钟

week04

学习this、闭包

this

前端基础进阶(七):全方位解读 this JavaScript 深入之从 ECMAScript 规范解读 this 浏览器工作原理与实践 --- 11-this:从 JavaScript 执行上下文的视角讲清楚 this

闭包

前端基础进阶(五):闭包 前端基础进阶(六):setTimeout 与循环闭包面试题详解 JavaScript 深入之闭包

作业

  • 写出下面运行的结果

    var name = 'window';
    var person1 = {
      name: 'person1',
      foo1: function() {
        console.log(this.name);
      },
      foo2: () => console.log(this.name),
      foo3: function() {
        return function() {
          console.log(this.name);
        };
      },
      foo4: function() {
        return () => {
          console.log(this.name);
        };
      },
    };
    var person2 = { name: 'person2' };
    
    person1.foo1();
    person1.foo1.call(person2);
    
    person1.foo2();
    person1.foo2.call(person2);
    
    person1.foo3()();
    person1.foo3.call(person2)();
    person1.foo3().call(person2);
    
    person1.foo4()();
    person1.foo4.call(person2)();
    person1.foo4().call(person2);
    
答:   
person1。foo1()被对象person1拥有,所以this指向person1
person2。foo1内部的this指向改为person2

window。箭头函数不创建函数上下文,this是继承person作用域的this
window。箭头函数的this不被调用方式影响,定义时已决定

window。函数单独调用,this指向window(非严格模式)
window。person1.foo3.call(person2).使得foo3函数指向person2,但是返回的函数内部指向this没有改变。然后执行(),this还是指向window(非严格模式)
person2。将foo3返回的函数内部this指向person2。

person1。由于箭头函数的this和foo4作用域的this一样,普通函数的this是可以改变的。所以这里的this.name相当于在调用foo4的this.name
person2。这里改变了foo4的this指向person2.所以返回person2
person1。foo4()返回的是箭头函数,单纯的箭头函数this不能改变,申明的时候已经和foo4绑定了,call相当于只是一个调用作用,foo4的this指向person1

  • 写出下面运行的结果

    var name = 'window';
    function Person(name) {
      this.name = name;
      this.foo1 = function() {
        console.log(this.name);
      };
      this.foo2 = () => console.log(this.name);
      this.foo3 = function() {
        return function() {
          console.log(this.name);
        };
      };
      this.foo4 = function() {
        return () => {
          console.log(this.name);
        };
      };
    }
    var person1 = new Person('person1');
    var person2 = new Person('person2');
    
    person1.foo1();
    person1.foo1.call(person2);
    
    person1.foo2();
    person1.foo2.call(person2);
    
    person1.foo3()();
    person1.foo3.call(person2)();
    person1.foo3().call(person2);
    
    person1.foo4()();
    person1.foo4.call(person2)();
    person1.foo4().call(person2);
    
答:
  person1.foo1();//person1。被person1拥有,this指向person1.
  person1.foo1.call(person2);//person2。改变foo1的this指向为person2

  person1.foo2();//person1。箭头函数,定义时的this构造的实例,即person1
  person1.foo2.call(person2);//person1.箭头函数不修改this

  person1.foo3()();//window。单独调用
  person1.foo3.call(person2)();//window。改变了foo3函数的this,返回的函数没有改变,单独调用
  person1.foo3().call(person2);//person2。改变了返回函数的this。

  person1.foo4()();//person1。//返回的箭头函数的this是上一层真正函数的this,也就是第一个person1.foo4()的调用时的this,person1.
  person1.foo4.call(person2)();//person2。改变了foo4的this
  person1.foo4().call(person2);//person1。箭头函数this改变无效,内部this和foo4的this一样
  • 写出下面运行的结果

    function foo() {
      var myName = '每日互动';
      let test1 = 1;
      const test2 = 2;
      var innerBar = {
        getName: function() {
          console.log(test1);
          return myName;
        },
        setName: function(newName) {
          myName = newName;
        },
      };
      return innerBar;
    }
    var bar = foo();
    bar.setName('个推');
    bar.getName();
    console.log(bar.getName());
    
1
1
个推
return innerBar 的时候,因为两个内部函数都有对foo作用域内变量的引用,所以foo函数退出时,会进行一个打包,所以bar的方法可以访问到foo作用域的变量