this指向问题
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,一般情况下this的最终指向的是那个调用它的对象。
-
全局作用域或者普通函数中this指向全局对象window(注意定时器里面的this指向window)
-
方法调用中谁调用this指向谁
-
构造函数中this指向构造函数的实例
location对象
window对象给我们提供了一个location属性用于获取或设置窗体的URL,并且可以用于解析URL。因为这个属性返回的是一个对象,所以我们将这个属性也成为location对象。
console.log(location.href);
console.log(location.host);
console.log(location.port);
console.log(location.pathname);
console.log(location.search);
console.log(location.hash);
location对象属性 | 返回值 |
---|---|
location.href | 获取或者设置整个URL |
location.host | 返回主机(域名) |
location.port | 返回端口号,如果未写返回 空字符串 |
location.pathname | 返回路径 |
location.search | 返回参数 |
location.hash | 返回片段 #后面内容 常见于链接 锚点 |
location.search获取到参数解析为对象形式:
// 获取到参数
let userData = location.search;
// 去掉第一个字符(?) 以&分割
userDataList = userData.substr(1).split('&');
let newDict = new Object();
// 遍历数组以=分割 赋值给对象内
for (let i = 0; i < userDataList.length; i++) {
var obj = userDataList[i].split('=');
newDict[obj[0]] = obj[1];
}
console.log(newDict);
URLSearchParams方式获取参数解析为对象形式:
// 创建URLSearchParams(参数为location.search的参数)的对象
let userData = new URLSearchParams(location.search);
// 直接创建对象 URLSearchParams对象.get('键名')
let newDict = {
'username': userData.get('username'),
'password': userData.get('password'),
};
console.log(newDict);
navigator对象
navigator 对象包含有关浏览器的信息,它有很多属性,我们最常用的是 userAgent,该属性可以返回由客户机发送服务器的 user-agent 头部的值。
判断用户是用手机浏览页面还是电脑浏览页面:
if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
window.location.href = ""; //手机
} else {
window.location.href = ""; //电脑
}
history对象
window对象给我们提供了一个 history对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的URL。
history对象方法 | 作用 |
---|---|
back( ) | 可以后退功能 |
forward( ) | 可以前进功能 |
go( 参数 ) | 参数为1前进一个页面 参数为-1后退一个页面 |
js是单线程
JavaScript语言的一大特点就是
单线程
,也就是说,同一个时间只能做一件事
。这是因为Js这门脚本语言诞生的使命所致------Js是为处理页面中用户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。应该先进行添加,之后再删除。
单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。
这样所导致的问题是: 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。
同步任务和异步任务
单线程导致的问题就是后面的任务等待前面任务完成,如果前面任务很耗时(比如读取网络数据),后面任务不得不一直等待。
为了解决这个问题,利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程,但是子线程完全受主线程控制。于是,JS 中出现了同步任务和异步任务。
同步任务:
在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
异步任务:
不进入主线程、而进入"任务队列"的任务,当主线程中的任务运行完了,才会从"任务队列"取出异步任务放入主线程执行
常见的异步任务:
- 资源加载,例:load、error
- 所有的事件操作
- 定时器
- (
定时器的定义属于同步任务,而定时器的回调函数属于异步任务。
)
- (