this指哪儿

this的指向问题

一、this初识

this是javascript中最复杂的机制之一。它尤为特殊,被自动定义在所有函数的作用域中。这篇文章将浅析this与函数的关系。

二、了解this

学习this的第一步就是明白this既不指向自身也不指向函数本身的词法作用域,而是指向当前行为的执行者,即:哪个函数调用函数,函数里面的this就指向哪个对象。

三、this指向

this的指向要分以下五种情况:

  • 普通函数
  • 自执行函数
  • 事件绑定
  • 构造函数
  • call、apply和bind

1、普通函数

function fn(){
  console.log(this);
}
fn();

此时,fn()执行,实际上是window.fn();此时this指向window

function fn(){
  console.log(this);
}
var obj = {fn:fn,name:"sean"};
obj.fn();

此时,使用obj调用fn(),此时this指向obj

2、自执行函数

(function(){
  console.log(this)
})();

此时,this指向window

再看下面这个代码

var name = "gary";
function fn() {
    console.log(this.name);
    (function(){
         console.log(this.name)
     })();
}
var obj = { fn: fn, name: "sean" };
obj.fn();

此时控制台输出

1746270-20190912135448930-1174488893.png

所以,自调用函数的this指向永远指向window

3、事件绑定

  • DOM零级事件
oBtn.onclick = function(){
  console.log(this);                //this->oBtn
}
  • DOM二级事件
oBtn.addEventListener("click",function(){
    console.log(this);              //this->oBtn
})

4、构造函数

function Test(name,age){
  this.name = name;
  this.age = age;
  this.print = function(){
    console.log(this.name + " " + this.age);
  }
}
var t = new Test("sean",22);
t.print();

此时,构造函数中的this,指向的是t这个实例,也就是说,哪个实例执行,this就指向谁

5、call、apply和bind

这一部分在我另一篇文章里,详情戳这里


参考文章

你还没懂this?

javascript中this的指向问题

转载于:https://www.cnblogs.com/seanxushuo/p/11511532.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: synchronized this 的是在 Java 中使用 synchronized 关键字来锁定当前对象(即 this 对象),以保证在多线程环境下对该对象的访问是同步的。当一个线程进入 synchronized 块时,它会尝试获取该对象的锁,如果该锁已被其他线程占用,则该线程会被阻塞,直到该锁被释放。这样可以避免多个线程同时访问该对象导致的数据竞争和不一致性问题。 ### 回答2: synchronized关键字是Java中用来保障线程安全的一种机制,它可以锁定某些代码块或方法,确保同一时间只有一个线程可以访问,也就是说,当一个线程访问一个synchronized方法或代码块时,其他线程将被阻塞,直到当前线程执行完毕才能继续。 在Java中,synchronized(this)的就是使用当前对象作为锁的对象,也就是说,当一个线程访问该代码块或方法时,会获取该对象的锁,确保同一时间内只有一个线程能够进入并执行该代码块或方法。 这种机制通常被用于解决多线程并发访问共享资源时产生的问题,例如线程安全、多线程执行顺序和是否允许多个线程同时执行等问题。使用synchronized(this)能够有效地实现对共享资源的同步访问,确保线程安全,避免数据错误、死锁等问题的出现。 当然,在使用synchronized关键字时需要注意一些细节,例如不要在循环内部加锁,避免影响程序性能;也要注意控制锁的粒度,避免因锁的范围太大而出现性能问题。在正确使用synchronized关键字的前提下,它能够帮助我们实现高效且安全的多线程编程。 ### 回答3: synchronized关键字在Java中常用于实现线程间同步,可以在方法声明时或语句块中使用。在方法声明中,可以使用synchronized来修饰整个方法或方法中的某些代码块;在语句块中,可以使用synchronized来修饰某个对象。当多个线程同时操作共享对象时,使用synchronized可以确保同一时刻只能有一个线程操作该对象。 synchronized this是以对象为锁的方式进行多线程同步。它是一种常用的同步方式,即在方法声明时,在方法前加上synchronized,表示该方法是同步方法,多个线程对该方法的调用将排队进行。当线程访问同步方法时,会自动获得该方法所在对象的锁,其他线程将无法访问该对象的其他同步方法,直到该线程释放了锁为止。如果在非synchronized方法中访问synchronized this对象,则需要先获取该对象的锁才能执行该方法。 需要注意的是,synchronized this对象只有在同一个对象上才能生效,即对于不同的对象,它们的锁是不同的。因此,如果有多个线程同时访问不同的对象,即使它们使用的是同一个同步方法,在不同的对象上进行调用,仍然不会同时被阻塞。此时需要使用其他同步方式,如synchronized方法块或Lock机制。 总之,synchronized this是一种常用的线程同步方式,可以确保一段代码在同一时刻只能被一个线程执行。在使用时需要注意对象锁的问题,尽量避免死锁的发生。同时,在实际开发中,还应当结合其他线程同步机制进行综合使用,以提高程序的可靠性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值