前言:

本文内容:变量的作用域 let和const、方法的定义和调用 apply、Date日期对象

推荐免费JavaScript基础讲解视频:【狂神说Java】JavaScript最新教程通俗易懂_哔哩哔哩_bilibili

变量的作用域、let、const

变量的作用域

js中,var定义变量实际是有作用域的。

假设在函数体中声明,则在函数体外不可以使用。

1
2
3
4
5
function box(){
var x = 1;
x = x+1;
}
x = x+2;//x is not defined

如果两个函数使用了相同的变量名,只要在函数内部,就不冲突。

1
2
3
4
5
6
7
8
function box(){
var x = 1;
x = x+1;
}
function box1(){
var x = 2;
x = x+1;
}

内部函数可以访问外部函数的成员,反之则不行。

1
2
3
4
5
6
7
8
function box(){
var x = 1;
// 内部函数可以访问外部函数的成员,反之则不行
function box1(){
var y = x+1;
}
var z = y+1;
}

假设,内部函数变量和外部函数的变量重名。

假设在JavaScript中,函数查找变量从自身函数开始,由内向外查找 ,假设外部存在同名的函数变量,内部变量会屏蔽外部变量。

1
2
3
4
5
6
7
8
9
10
11
function box(){
var x = 1;

function box1(){
var x = 'A';
console.log(x)
}
box1()
console.log(x)
}
box()

提升变量的作用域

1
2
3
4
5
6
function box(){
var x = 'x'+y;
console.log(x);// xundefined
var y = 'y';
}
box()

结果:xundefined

js执行引擎自动提升了y的声明,但不会提升变量y的赋值。

建议所有的变量定义都放在函数的头部,便于维护。

1
2
3
4
5
6
function box1(){
var y;
var x = 'x'+y;
console.log(x)
y = 'y';
}

全局函数

1
2
3
4
5
6
7
// 全局变量
x =1;
function box(){
console.log(x);
}
console.log(x);
box()

全局对象:window

1
2
3
var x = 'xxx';
alert(x);
alert(window.x);// 默认所有的全局变量,都会自动绑定window对象。

alert()本身也是一个window变量。

1
2
3
4
5
6
7
8
9
10
11
12
var x = 'xxx';
window.alert(x);

var old_alert = window.alert;
window.alert = function(){
};
// alert() 失效
window.alert(123);

// 恢复
window.alert = old_alert;
window.alert(456);

js实际只有一个全局作用域,任何变量(函数也可视为变量),假设没有在函数作用范围内找到,就会向外查找。如果在全局作用域中也没找到,就会报RefrenceError

规范:

由于我们所有的全局变量都会绑定到window上,如果不同js文件使用相同的全局变量,可能发生冲突-> 减少冲突的方法;

1
2
3
4
5
6
7
// 唯一全局变量
var Jokerdig ={}
// 定义全局变量
Jokerdig.name='JokerDaxiong';
Jokerdig.add = function(a,b){
return a+b;
}

把自己的代码全部放入自己定义的唯一空间中,降低全局命名冲突的问题;

局部作用域 let:

1
2
3
4
5
6
function section(){
for (var i = 0; i <100 ; i++) {
console.log(i)
}
console.log(i+1)// i在作用域外还可使用?
}

ES6 let关键字,解决局部作用域冲突;(推荐使用)

1
2
3
4
5
6
function section(){
for (let i = 0; i <100 ; i++) {
console.log(i)
}
console.log(i+1)// Uncaught ReferenceError: i is not defined
}

常量const

在ES6之前,定义常量:只要用全部大写字母命名的就是常量;

1
2
3
4
var PI = '3.14';
console.log(PI);
PI = '213';// 可以被改变
console.log(PI);

ES6引入const,来定义常量。

1
2
3
const PI ='3.14';// 只读变量
console.log(PI);
//PI = '213'; 直接报错

方法的定义和调用、apply

定义方法

方法就是把函数放在对象里;(对象包括:属性和方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var jokerdig ={
name: 'JokerDaxiong',
sex: '男',
birth: 1999,
// 方法
age: function () {
var now= new Date().getFullYear();
return now-this.birth;
}
}
// 属性
jokerdig.name
// 调用方法
jokerdig.age()

this代表什么?

拆分上方代码;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 拆分开
function getAge(){
// 计算年龄
var now= new Date().getFullYear();
return now-this.birth;
}

var jokerdig ={
name: 'JokerDaxiong',
sex: '男',
birth: 1999,
// 方法
age: getAge
}
console.log(jokerdig.age())
// jokeerdig.age() 正常显示
// getAge() NaN

this是无法指向的,它默认指向调用它的那个对象;

apply

在JavaScript中控制this指向;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 // 拆分开
function getAge(){
// 计算年龄
var now= new Date().getFullYear();
return now-this.birth;
}

var jokerdig ={
name: 'JokerDaxiong',
sex: '男',
birth: 1999,
// 方法
age: getAge
}
console.log(jokerdig.age())
// jokeerdig.age() 正常显示
// getAge() NaN
// 使用apply 使this指向jokerdig,参数为空
console.log(getAge.apply(jokerdig,[]))

Date日期对象

标准对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof NaN
"number"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined"

Date对象

Date基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Date基本使用
var now = new Date();
console.log(now)
// VM79:1 Thu Feb 24 2022 15:05:04 GMT+0800 (中国标准时间)
console.log(now.getFullYear());// 年
console.log(now.getMonth());// 月份 0-11 代表月
console.log(now.getDay());// 星期几
console.log(now.getDate());// 星期几
console.log(now.getHours());// 时
console.log(now.getMinutes());// 分
console.log(now.getSeconds());// 秒
console.log(now.getTime());// 时间戳 全球统一 1790 1.1 0:00:00 开始
console.log(new Date(1645686594044)); // 时间戳转为时间
//调用是方法不是属性
console.log(now.toLocaleString());// 打印本地时间