js参考手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript
作用域#
全局变量#
在js种 一堆{} 就是一个作用域。使用var声明的变量是全局变量, 全局变量可以在任何变量的任何位置使用。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> </body> <script> { var number = 1 console.log(number) //1 } console.log(number) //1 </script> <script> console.log(number) //1 </script> </html>
由此看出,全局变量的生命周期并没有被{}限制着,这是因为全局变量会发生变量的提升,也就是会被提升的
在if,for,while条件的{}种使用var生命的变量都是全局变量。
局部变量#
在函数内部声明的变量是局部变量。下面的js就会报错。说找不到number
<script> function f() { var number = 1 console.log(number) } f() console.log(number) </script>
当函数被调用完后,函数占用的空间就会被释放掉。
隐式全局变量#
如果函数种的变量没有被var修饰,就会自动的转换成隐式全局变量, 函数执行完后,变量所占的空间不会被释放掉。
<script> function f() { number = 1 console.log(number) } f() console.log(number) </script>
预解析#
示例1:
<script> console.log(number) var number = 1 </script>
上面的代码经过预解析会变成下面这样, 所以控制台上会输入undefined
<script> var number console.log(number) number = 1 </script>
示例2:下面的函数是可以正常执行的,也就是说,经过预解析,函数定义会被提前到函数的定义前面去。
<script> f() function f() { console.log("函数执行") } </script>
示例3:
<script> f() var num = 10 function f() { console.log(num) var num = 20 } </script> 会被解析成下面这样 <script> function f() { var num console.log(num) num = 20 } f() var num = 10 </script>
所以最终的结果就是undefined
日期相关#
参考手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date
字符串相关#
参考手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String
元素创建的不同方式#
方式1:document.write("")#
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button id="btn">点我创建p</button> </body> <script> document.getElementById("btn").onclick = function () { document.write("<p>123</p>") } </script> </html>
这种write的方式创建标签,会覆盖原来的文档流
方式2:innerHTML#
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> div { width: 100px; height: 100px; border: 1px solid; } </style> </head> <body> <button id="btn">点我创建p</button> <div id="dv"> </div> </body> <script> document.getElementById("btn").onclick = function () { document.getElementById("dv").innerHTML = "<p>123</p>" } </script> </html>
通过innerHtml创建元素,可以实现在当前元素的基础上实现累加。原文档流依然存在。
方式3:document.createElement("tagName")#
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> div { width: 100px; height: 100px; border: 1px solid; } </style> </head> <body> <button id="btn">点我创建p</button> <div id="dv"> </div> </body> <script> document.getElementById("btn").onclick = function () { var pObj = document.createElement("p") pObj.innerText="this is a p" document.getElementById("dv").appendChild(pObj) } </script> </html>
事件的冒泡#
什么是事件的冒泡?
事件的冒泡指的是,如果多个元素嵌套在一起,并且他们绑定了相同的事件,这时,如果内层的元素的事件被触发了,事件会往外冒泡,导致外层的事件也被触发。
如下例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #dv1 { width: 100px; height: 100px; border: 1px solid; } #dv2 { width: 80px; height: 80px; border: 1px solid; } #dv3 { width: 50px; height: 50px; border: 1px solid; } </style> </head> <body> <button id="btn">点我创建p</button> <div id="dv1"> <div id="dv2"> <div id="dv3"> </div> </div> </div> </body> <script> document.getElementById("dv1").onclick = function () { console.log(this.id) } document.getElementById("dv2").onclick = function () { console.log(this.id) } document.getElementById("dv3").onclick = function () { console.log(this.id) } </script> </html>
阻止事件的冒泡#
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #dv1 { width: 100px; height: 100px; border: 1px solid; } #dv2 { width: 80px; height: 80px; border: 1px solid; } #dv3 { width: 50px; height: 50px; border: 1px solid; } </style> </head> <body> <button id="btn">点我创建p</button> <div id="dv1"> <div id="dv2"> <div id="dv3"> </div> </div> </div> </body> <script> document.getElementById("dv1").onclick = function () { console.log(this.id) } document.getElementById("dv2").onclick = function (event) { console.log(this.id) // 谷歌和火狐支持 event.stopPropagation() } document.getElementById("dv3").onclick = function () { console.log(this.id) // 谷歌和IE支持 window.event.cancelable=true } </script> </html>
页面加载事件#
<script> // 页面加载完毕后会执行这个方法 window.onload=function () { } // 页面关闭后执行,ie8支持,谷歌不支持 window.onunload=function () { } // 页面关闭前执行,ie8支持,谷歌不支持 window.onbeforeunload=function () { } </script>
location对象#
location对象就是浏览器的地址栏对象
<script> window.onload = function () { console.log(window.location) } </script>
打印结果如下图:
下图中的href属性中,63342后面的%E5%89%8D%E7%AB%AF%E7%AC%94%E8%AE%B0 是url中的汉字被编码后的效果
下图中的hash,指的是地址栏中#及后面的值
下图中的host,指的是地址栏中的主机名+端口号
设置跳转的页面
<body> <button id="btn">点我跳转</button> </body> <script> document.getElementById("btn").onclick = function () { // 通过这种方式可以点击浏览器的后退按钮回退页面 location.href = "http://www.baidu.com" } document.getElementById("btn").onclick = function () { // 效果同上,只不过他属于方法 location.assign("http://www.baidu.com") } document.getElementById("btn").onclick = function () { // 页面发生跳转后,无法通过浏览器的回退按钮返回原页面 location.replace("http://www.baidu.com") } </script>
重新加载页面
<script> location.reload() </script>
history对象#
history也是window内置的一个对象。
通过它可以实现页面的前进和后退
示例: html01
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> </style> </head> <body> <button id="btn1">点我跳转</button> <button id="btn2">点我前进</button> </body> <script> document.getElementById("btn1").onclick = function () { location.assign("02.html") } document.getElementById("btn2").onclick = function () { window.history.forward() } </script> </html>
html02
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button id="btn">点我回退</button> </body> <script> document.getElementById("btn").onclick = function () { window.history.back() } </script> </html>
navigator对象#
通过这个对象可以判断当前系统型号,当前浏览器的型号
window.navigator.userAgent // 浏览器的类型 window.navigator.platform // 系统平台