引言
今天学了JS关于变量作用域的一些东西,发现JS真是过于随意。在内存分配和作用范围上面,JS相比python都还要随意。C/C++的我直接三观稀碎。
1. 数组增添元素
var arr = [1,2,3] // arr.length=3
arr.length=5 //可以手动直接修改数组的长度
console.log(arr) //[1,2,3,undefined,undefined]
arr.push(4) //[1,2,3,4]
arr[3]=4 //[1,2,3,4]
arr[arr.length]=4 //[1,2,3,4]
2. 函数内置arguments
在定义函数的时候往往需要设定接口的参数,包括个数和类型。但是当我们不清楚到底有多少个参数的时候,arguments作为伪数组(只有长度和索引的特性),会将所有的形参都存储下来。
function fn(){ //每个函数内置一个 arguments
console.log(arguments) // { '0': 1, '1': 2, '2': 3 }
console.log(arguments.length) // 3
console.log(arguments[2]) // 3
}
fn(1,2,3)
3. 作用域
关于作用域是JS我觉得最草,最随意的地方。
3.1 函数作用域
var num1 = 70
var t = 50
function fn(t){ //形参是局部变量
num2 = 100 //函数内部给一个没有声明的变量num2赋值,num2直接当作全局变量使用
var num1 = 100 //函数内部声明的变量是局部变量
}
console.log(t) // 50
console.log(num1) // 70
function fun(){
t = 500 // 这里函数什么都没有声明,直接对全局变量 t 赋值,有点离谱
}
console.log(t) // 500
3.2 块级作用域:JS没有块级作用域
if (true){
var a = 3
}
console.log(a) //竟然有输出,a是全局变量
3.3 变量就近查找
函数里面再定义函数,又是一个骚操作。但是感觉实际上,很少会这么用。
var num = 500
function(){
var num = 100
function(){
console.log(num) // 100
/* 内部函数就近查找外部函数是否有该变量
如果有就直接输出,没有就再到外层去找 */
}
}