• JAVA中的this关键字和JavaScript中的this关键字比较
  • 发布于 1个月前
  • 31 热度
    0 评论
  • 封锁爱
  • 0 粉丝 10 篇博客
  •   
1、this指向谁
Java中this指向的是当前类的实例对象,JavaScript中this指向的是函数的调用者。不同于Java,JavaScript中函数可以直接执行,函数可以作为对象的方法(通过对象调用方法)执行,函数可以作为构造函数创建对象。

2、普通函数调用
<script>
  function Student(name) {
    this.name = name;
    console.log(this, this.name);
  }
  Student("star");//window star
  console.log(window.name);//star
</script>
直接调用函数时,this指向了window对象,函数是由浏览器窗口执行的,所以name属性被添加到了window对象上,此时this和window是等价的。
3、对象调用方法
<script>
  // 堆代码 duidaima.com
  var name = "moon";
  var obj = {
    name: "star",
    hello: function () {
      var hi = function () {
        console.log(this, this.name);
      }
      hi();//window moon
      return this.name;
    }
  }
  console.log(obj.hello());//star
</script>
由于hello方法的调用者是obj,所以在hello中返回this.name可以获取到对象obj的name属性值,在hello方法中this和obj是等价的。hi函数虽然在hello方法内部,但是没有调用者,所以this是window对象。
4、构造函数
<script>
  function Student(name) {
    this.name = name;
    console.log(this, this.name);
  }
  var star = new Student("star");//Student {name: 'star'} star
  console.log(star.name);
  var moon = new Student("moon");//Student {name: 'moon'} moon
  console.log(moon.name);
</script>
使用构造函数的形式类似Java创建对象,this就是刚创建出来的对象。
5、使用call & apply改变this指向
<script>
  var name = "star";
  var obj = {
      name: "moon"
  }
  var show = function show() {
    console.log(this, 
        this.name, 
       `age:${arguments[0]}, salary:${arguments[1]}`);
  }
  show();
  show.call(obj, 25);
  show.apply(obj, [25, 3000]);
</script>
通过call和apply可以改变当前的this指向,直接执行show函数时this指向的是window对象,call和apply调用时this指向了第一个参数,类似Java的反射方法调用(method.invoke(obj,params))。
用户评论