前言:
本文内容:变量的作用域 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;
|
如果两个函数使用了相同的变量名,只要在函数内部,就不冲突。
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); 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);
|
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(){ };
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) }
|
ES6 let
关键字,解决局部作用域冲突;(推荐使用)
1 2 3 4 5 6
| function section(){ for (let i = 0; i <100 ; i++) { console.log(i) } console.log(i+1) }
|
常量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);
|
方法的定义和调用、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())
|
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()) 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
| var now = new Date(); console.log(now)
console.log(now.getFullYear()); console.log(now.getMonth()); console.log(now.getDay()); console.log(now.getDate()); console.log(now.getHours()); console.log(now.getMinutes()); console.log(now.getSeconds()); console.log(now.getTime()); console.log(new Date(1645686594044)); console.log(now.toLocaleString());
|