JavaScript
函数
变量的作用域
在JavaScript中,var定义变量实际是有作用域的。
假设在函数体中声明,则在函数体外不可以使用。
function qj(){
var x = 1;
x = x + 1;
}
x = x + 2;
如果两个函数使用了相同的变量名,只要在函数内部,就不冲突
function qj(){
var x = 1;
x = x + 1;
}
function qj1(){
var x = 'abc';
x = x + 1;
}
内部函数可以访问外部函数的成员,反之则不行
function qj(){
var x = 1;
function qj1(){
var y = x + 1;
}
var z = y + 1;
}
假设,内部函数变量和外部函数,重名!
JavaScript中函数查找从自身函数开始,由"内"向“外”查找。假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。
function qj(){
var x = 1;
function qj1(){
var x = 'A';
console.log('inner'+x);
}
console.log('outer'+x)
qj1()
}
提升变量的作用域
function qj1(){
var x = "x" + y;
console.log(x);
var y = 'y';
}
结果:xundefined
说明:js执行引擎,自动提升了Y的声明顺序,但是不会提升变量y的赋值的顺序。
function qj1(){
var y;
var x = "x" + y;
console.log(x);
y = 'y';
}
这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护
全局变量
x = 1;
function f(){
console.log(x);
}
f();
console.log(x);
全局对象 window
var x = "xxx";
alert(x);
alert(window.x);
alert()这个函数本身也是一个 window 变量
var x = "xxx";
window.alert(x);
var old = window.alert;
window.alert = function (){
} ;
window.alert(1123);
window.alert = old;
window.alert(456);
JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错 RefrenceError。
规范
? 由于我们的所有的全局变量都会绑定到我们的window上,如果不同的js文件,使用了相同的全局变量,就会发生冲突。如何减少冲突?
var fengzi = {};
fengzi.name = 'jianghu';
fengzi.add = function (a,b){
return a+b;
}
把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题。
局部作用域 let
function aaa(){
for (var i = 0; i < 100; i++) {
console.log(i);
}
console.log(i+1);
}
ES6 let 关键字,解决局部作用域冲突问题
function aaa(){
for (let i = 0; i < 100; i++) {
console.log(i);
}
console.log(i+1);
}
建议都用 let 去定义局部作用域的变量;
常量 const
在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量;建议不要修改这样的值
var PI = '3.14';
PI = '321'
在ES6引入了常量关键字 const
const PI = "3.14";
PI = "321";
方法
定义方法:
方法就是把函数放在对象的里面,对象只有两个东西:属性和方法
var fengzi = {
name: '小明',
bitrh: 2000,
age: function(){
var now = new Date().getFullYear()
return now - this.bitrh;
}
}
fengzi.name
fengzi.age()
this代表什么?
function getAge(){
var now = new Date().getFullYear()
return now - this.bitrh;
}
var fengzi = {
name: '小明',
bitrh: 2000,
age: getAge();
}
this是无法指向的,是默认指向调用它的那个对象(java中是这样的);
apply
但在js中可以控制this的指向!
function getAge(){
var now = new Date().getFullYear()
return now - this.bitrh;
}
var fengzi = {
name: '小明',
bitrh: 2000,
age: getAge()
};
getAge.apply(fengzi,[]);
内部对象
标准对象
typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof NaN
"number"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined"
Date
基本使用
var now = new Date();
now.getFullYear();
now.getMonth();
now.getDate();
now.getDay();
now.getHours();
now.getMinutes();
now.getSeconds();
now.getTime();
console.log(new Date(1627695825997))
转换
now = new Date(1627695825997)
Sat Jul 31 2021 09:43:45 GMT+0800 (中国标准时间)
now.toLocaleDateString()
"2021/7/31"
now.toLocaleString
? toLocaleString() { [native code] }
now.toLocaleString()
"2021/7/31 上午9:43:45"
now.toGMTString()
"Sat, 31 Jul 2021 01:43:45 GMT"
JSON
JSON字符串和js对象的转化
var user = {
name : "fengzi",
age : 3,
sex : "男"
}
var jsonUser = JSON.stringify(user)
var obj = JSON.parse('{"name":"fengzi","age":3,"sex":"男"}');
很多人搞不清楚,JSON 和 js对象的区别
var obj = {a:"hello", b:"hellob"};
var json = '{"a":"hello", "b":"hellob"}';
面向对象编程
什么是面向对象
原型对象
JavaScript,Java,C#…这些语言都是面向对象的;但JavaScript有些区别!
在JavaScript中需要大家换一下思维方式!
原型:
var Student = {
name : "fengzi",
age : 3,
run: function (){
console.log(this.name+"run.....");
}
}
var Xiaoming = {
name:"xianming"
};
Xiaoming._proto_ = Student;
var Bird ={
fly: function(){
console.log(this.name+"fly.....");
}
};
Xiaoming._proto_ = Bird;
class 继承
class关键字是在ES6引入的
-
定义一个类,属性,方法
class Student{
constructor(name) {
this.name = name; }
hello(){
alert("hello");
} }
var xiaoming = new Student("xiaoming");
var xiaohong = new Student("xiaohong");xiaoming.hello()
-
继承
本质:查看对象原型

原型链
操作BOM对象(重点)
浏览器介绍
JavaScript 和浏览器关系?
JavaScript 的诞生就是为了能够让他在浏览器中运行!
BOM:浏览器对象模型
主流浏览器:
- IE 6~11
- Chrome
- Safari
- FireFox
三方:
Window
window 代表浏览器窗口
window.alert(1)
undefined
window.innerHeight
150
window.innerWidth
718
window.outerHeight
790
window.outerWidth
732
Navigator(不建议使用)
Navigator,封装了浏览器的信息
window.navigator.appName
"Netscape"
navigator.appVersion
"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55"
navigator.userAgent
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55"
navigator.platform
"Win32"
大多数时候,我们不会使用navigator对象,因为会被人为修改!不建议使用这些属性来判断和编写代码
screen
代表屏幕尺寸
screen.width
1536px
screen.height
864px
location (重要)
location 代表当前页面的URL信息
host: "www.baidu.com"
href: "https://www.baidu.com/"
protocol: "https:"
reload: ? reload()
location.assign("")
document
document 代表当前页面,HTNL DOM文档树
document.title
"百度一下,你就知道"
document.title = '小度小度'
"小度小度"
获取具体的文档树节点
<dl id="app">
<dt>Java</dt>
<dt>JavaSE</dt>
<dt>JavaEE</dt>
</dl>
<script>
var dl = document.getElementById(`app`);
</script>
获取cookie
document.cookie
history(不建议使用)
history :代表浏览器的历史记录
history.back()//网页后退一页
history.forward()//网页前进一页
操作DOM对象(重点)
核心
浏览器网页就是一个Dom树形结构!
- 更新:更新Dom节点
- 遍历dom节点:得到Dom节点
- 删除:删除一个Dom节点
- 添加:添加一个新的节点
获得节点
要操作一个Dom节点,就必须要先获得这个Dom节点
var h1 = document.getElementsByTagName('h1')
var p1 = document.getElementById('p1')
var p2 = document.getElementsByClassName('p2')
var div1 = document.getElementById('div1')
var childrens = div1.children
div1.children[index]
更新节点
<div id="id1">
</div>
<script>
var id1 = document.getElementById("id1");
</script>
操作文本
- **id1.innerText=‘456’**修改文本的值
- **id1.innerHTML=’< strong>123</ strong>’**可以解析HTML文本标签
操作css
id1.style.color = 'yellow';
id1.style.fontSize = '20px'
id1.style.padding = '2em';
删除节点
删除节点的步骤:先获取父节点,在通过父节点删除自己
<div id="div1">
<h1>标题一</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
var p1 = document.getElementById('p1')
var div1 = p1.parentElement;
div1.removeChild(p1)
div1.removeChild(div1.children[0])
div1.removeChild(div1.children[1])
div1.removeChild(div1.children[2])
</script>
注意:删除多个节点的时候,children是在时刻变化的,删掉第一个了,第二个就成了第一个,删除节点的时候一定要注意!
插入节点
- 我们获得了某个Dom节点,假设这个Dom节点是空的,我们通过innerHtml就可以增加一个元素了,但是这个Dom节点已经存在元素了,我们就不能这么干了!会产生覆盖。
追加
<p id="js">JavaScript</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
var js = document.getElementById('js')
var list = document.getElementById('list')
list.appendChild(js)
</script>
效果:

创建一个新的标签,实现插入
var newp = document.createElement('p');
newp.id='newp';
newp.innerText = 'hello,world';
var myScript = document.createElement('script');
myScript.setAttribute('type','text/javascript')
var myStyle = document.createElement('style');
myScript.setAttribute('type','test/css');
myStyle.innerHTML = 'body{ background-Color:chartreuse;}';
document.getElementsByTagName('head')[0].appendChild(myStyle);
insert:
var ee = document.getElementById('ee');
var js = document.getElementById('js');
var list = document.getElementById('list');
list.insertBefore(js,ee)
操作表单(验证)
表单是什么
- from 也是DOM树下的一个子节点
- 文本框 text
- 下拉框 < select>
- 单选框 radio
- 多选框 checkbox
- 隐藏域 hidden
- 密码框 password
- …
表单的目的
获得要提交的信息
<form action="post">
<p>
<span>用户名:</span> <input type="text" id="username">
</p>
<p>
<span>性别:</span>
<input type="radio" name="sex" value="nan" id="boy">男
<input type="radio" name="sex" value="" id="girl">女
</p>
</form>
<script>
var boy = document.getElementById("boy");
var girl = document.getElementById("girl");
var input_text = document.getElementById("username");
input_text.value
input_text.value = '123'
boy.checked;
</script>
提交表单
<form action="https://www.baidu.com/" method="post" onsubmit="return aaa()">
<p>
<span>用户名:</span> <input type="text" id="username" name="username">
</p>
<p>
<span>密码:</span> <input type="text" id="password">
</p>
<input type="hidden" id="word" name="password">
<button type="submit">提交</button>
</form>
<script>
function aaa(){
var uname = document.getElementById('username');
var pword = document.getElementById('password');
var hword = document.getElementById('word');
hword.value = pword.value;
console.log(uname.value);
console.log(pword.value);
return true;
}
</script>
|