Js 基础补充

简介: js参考手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript

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  // 系统平台
相关文章
|
JavaScript
JS基础之解构赋值
解构赋值 在js中,我们经常会将对象或者数组里面的一部分数据作为参数传递给函数,如果我们使用传统的.方法会很麻烦。
|
JavaScript 前端开发
JavaScript 入门基础 - 运算符(三)
文章目录 JavaScript 入门基础 - 运算符(三) 1.什么是运算符 2.表达式和返回值 3.算术运算符概述 4. 赋值运算符 5.递增和递减运算符 5.1 递增和递减运算符概述 5.2 递增运算符 5.2.1 前置递增运算符 5.2.2 后置递增运算符 5.2.3 后置和前置运算符的区别 6. 比较运算符 7. 逻辑运算符 7.1 逻辑运算符概述 7.2 逻辑与 7.3 逻辑或 7.4
122 0
JavaScript 入门基础 - 运算符(三)
|
存储 JSON JavaScript
JavaScript 入门基础 - 变量 / 数据类型(二)
JavaScript 入门基础 - 变量 / 数据类型(二)
88 0
JavaScript 入门基础 - 变量 / 数据类型(二)
|
JavaScript 前端开发 物联网
JavaScript 入门基础 / 概念介绍(一)
JavaScript 入门基础 / 概念介绍(一)
112 0
JavaScript 入门基础 / 概念介绍(一)
|
JavaScript 前端开发 Java
JavaScript的基础使用
JavaScript的基础 一、javascript简介 JavaScript简称js,最初由网景(现在的Mozilla)公司创建,由于商标冲突原因,其标准版本命名为ECMAScript,但是一般人们还是叫JavaScript,只在谈标准的时候说到ECMAScript这个名字。值得注意的是JavaScript与java没有任何关系,就像雷峰塔(神话中镇压白娘子的塔)和雷锋。此外js(JavaScript)和jsp(java servlet pages)也没有关系。   js的工作分为两部分,一部分属于js语言本身的特性,而另一部需要依靠宿主环境(web浏览器)才能完成。 二、javascri
JavaScript的基础使用
|
JavaScript 前端开发
js 模块化基础和模块规范AMD、CMD、ES6模块
js 模块化基础和模块规范AMD、CMD、ES6模块
84 0
|
JavaScript 前端开发
原生js制作选项卡详解,适合无基础的人学习
原生js制作选项卡详解,适合无基础的人学习
109 0
原生js制作选项卡详解,适合无基础的人学习
|
JavaScript 前端开发
vue js文字跑马灯基础版本
提供两种解决思路
254 1
|
存储 JavaScript 前端开发
JavaScript基础(一篇入门)
JavaScript基础(一篇入门)
187 0
JavaScript基础(一篇入门)
|
XML JavaScript 前端开发
计算机二级web题目(5)--js(Javascript)基础
计算机二级web题目(5)--js(Javascript)基础
254 0