self对象
最近在学习new worker创建新线程的相关知识。然后发现子线程里面各种对self的使用。
基础知识相当不扎实的我有点懵逼,self 和 window 之间区分的原理到底是什么?
于是呢,我做了个实验:
<!DOCTYPE html>
<html>
<head>
<script>
window.onload = function() {
console.log(window === self);
console.log(window === window.self);
console.log(this === window);
console.log(this === self);
};
</script>
</head>
<body>
</body>
</html>
结果:
(吼吼~我就知道是这样,要不我怎么会分不清呢!)
其实 self 就是为了与 parent 对象对立的有语义的对象吧!本质上和window对象是一个概念。
嗯嗯,没错,在H5一些新特性出来之前事实就是这样的。
在H5的新规范中,提出了通过 Web Worker 来实现多线程的技术。
阮一峰的Web Worker 使用教程里面是这么说的:
Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。
Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用document、window、parent这些对象。但是,Worker 线程可以navigator对象和location对象。
很秀吧!多线程肯定是比单线程快很多的了。
但是,人家也说了,在worker线程中,window对象不能用了,因为worker线程跟主线程不一样,只有主线程才能操作DOM对象。所以就出现了我一开始提出的疑问,为啥worker子线程里面用的对象是全都是self了,这里的 self 指的是子线程自身,即子线程的全局对象。
也就是说web worker的出现赋予了self真实存在的意义!
了解!