js基础(杂记)

1、路由变换
(1)使用hash
获取url中的hash:http://www.bbbb.com#hashstr

`window.location.hash //#hashstr`

*   1

改变hash:

`window.location.hash = "#hahah";
// 变成http://www.bbbb.com#hahah`

*   1
*   2

最重要的是hashchange事件,通过这个事件来写页面跳转等的业务逻辑,每当url的hash改变都会触发这个事件

window.addEventListener("hashchange", function() {
    // 获取hash值
    var hash = window.location.hash;

    // 根据获取的hash做相应的操作
    . . .
});

(2)HTML5 history api
history.pushState([data], [title], [url])
history.replaceState([data], [title], [url])

  1. 第一个参数用来传递我们需要的数据,当页面的状态发生变化时我们可以接收到该数据。如用户点击浏览器的后退和向前按钮。需要注意的是在Firefox中只允许传递最多640K的数据。
  2. 第二个参数title是一个字符串,不过截止到目前,几乎所有的浏览器都忽略该参数。
  3. 最后一个参数是我们想要替换的URL。

window.onpopstate事件
popstate事件就会在对应window对象上触发. 如果当前处于激活状态的历史记录条目是由`history.pushState()方法创建,或者由history.replaceState()方法修改过的, 则popstate事件对象的`state属性包含了这个历史记录条目的state对象的一个拷贝.

window.onpopstate = function(event) {
  alert("location: " + document.location + ", state: " + JSON.stringify(event.state));
};
//绑定事件处理函数. 
history.pushState({page: 1}, "title 1", "?page=1");    //添加并激活一个历史记录条目 http://example.com/example.html?page=1,条目索引为1
history.pushState({page: 2}, "title 2", "?page=2");    //添加并激活一个历史记录条目 http://example.com/example.html?page=2,条目索引为2
history.replaceState({page: 3}, "title 3", "?page=3"); //修改当前激活的历史记录条目 http://ex..?page=2 变为 http://ex..?page=3,条目索引为3
history.back(); // 弹出 "location: http://example.com/example.html?page=1, state: {"page":1}"
history.back(); // 弹出 "location: http://example.com/example.html, state: null
history.go(2);  // 弹出 "location: http://example.com/example.html?page=3, state: {"page":3}

2、https
什么是HTTPS:与SSL(安全套接层)组合使用的HTTP被称为HTTPS(HTTP Secure,超文本传输安全协议)
HTTP协议与SSL组合使用,加密HTTP的通信内容。用SSL建立安全通信线路之后,就可以在这条线路通信了

HTTP + 加密 + 认证 + 完整性保护 = HTTPS
主要的加密方法分为两种:一种是共享密钥加密(对称密钥加密),一种是公开密钥加密(非对称密钥加密)

1、共享密钥加密:加密与解密使用同一个密钥
2、公开密钥(非对称密钥)

公开密钥使用一对非对称密钥。一把叫私有密钥,另一把叫公开密钥私有密钥不让任何人知道,公有密钥随意发送。

也就是说,发送密文方使用对方的公开密钥进行加密,对方接受到信息后,使用私有密钥进行解密。再不使用私有密钥情况下很难还原信息。

HTTPS采用共享密钥加密和公开密钥加密两者混合加密,两者都有各自的优点。共享密钥加密处理速度快,但密钥无法安全发送给对方;公开密钥加密处理速度慢,但密钥能够安全交换。

但如果我们将两种加密方式一起使用,则两种加密方式就能互补。也就是说,利用公开密钥加密方式安全地交换在共享密钥加密中要使用的密钥,在确保密钥安全前提下,使用共享密钥加密方式进行通信

3、this指向
this 的指向,是在调用函数时根据执行上下文所动态确定的。
(1)在执行函数时,如果函数中的 this 是被上一级的对象所调用,那么 this 指向的就是上一级的对象;否则指向全局环境。
(2)bind/apply/call:他们都是用来改变相关函数 this 指向的,但是 call/apply 是直接进行相关函数调用;bind 不会执行相关函数,而是返回一个新的函数,这个新的函数已经自动绑定了新的 this 指向,开发者需要手动调用即可。
(3)对象调用:
new 操作符调用构造函数具体做了什么?

  • 创建一个新的对象;
  • 将构造函数的 this 指向这个新对象;
  • 为这个对象添加属性、方法等;
  • 最终返回新对象。

以上过程,也可以用代码表述:

var obj  = {}
obj.__proto__ = Foo.prototype
Foo.call(obj)

如果构造函数有返回值:
如果构造函数中显式返回一个值,且返回的是一个对象,那么 this 就指向这个返回的对象;如果返回的不是一个对象,那么 this 仍然指向实例。
(4)箭头函数:根据外层(函数或者全局)上下文来决定。
优先级:
callapply 的显式绑定一般来说优先级更高。
new 绑定修改了 bind 绑定中的 this,因此 new 绑定的优先级比显式 bind 绑定更高。
箭头函数的绑定无法被修改。

4、代码执行
JavaScript 执行主要分为两个阶段:

  • 代码预编译阶段
  • 代码执行阶段

预编译阶段是前置阶段,这个时候由编译器将 JavaScript 代码编译成可执行的代码。
执行阶段主要任务是执行代码,执行上下文在这个阶段全部创建完成。

在通过语法分析,确认语法无误之后,JavaScript 代码在预编译阶段对变量的内存空间进行分配,我们熟悉的变量提升过程便是在此阶段完成的。

  • 预编译阶段进行变量声明;
  • 预编译阶段变量声明进行提升,但是值为 undefined;
  • 预编译阶段所有非表达式的函数声明进行提升。
    代码执行的整个过程说起来就像一条生产流水线。第一道工序是在预编译阶段创建变量对象(Variable Object),此时只是创建,而未赋值。到了下一道工序代码执行阶段,变量对象转为激活对象(Active Object),即完成 VO → AO。此时,作用域链也将被确定,它由当前执行环境的变量对象和所有外层已经完成的激活对象组成。这道工序保证了变量和函数的有序访问,即如果当前作用域中未找到变量,则继续向上查找直到全局作用域。
    闭包:函数嵌套函数时,内层函数引用了外层函数作用域下的变量,并且内层函数在全局环境下可访问,就形成了闭包。

你可能感兴趣的:(javascript)