1.使用一个变量就是在使用它的值
var a = 10;
console.log(a);
2.使用一个执行的函数就是在使用它的返回值
function fn() {
return 10
}
console.log(fn())
3.参数的默认值
function fn(a=10) {
console.log(a)
}
fn()//10
fn(20)//20
4.变量提升
var a;//在进入一个新的作用域时,显示声明的变量会被提升到作用内
a = 10;//给变量的声明的本质是使用变量,给不存在的变量赋值会在全局生成临时变量
5.全局污染
var obj = {
a: 10,
b: 100,
8: 100
}
//访问obj的属性a
console.log(obj.a)
//.语法访问 .后面的值会被解析成属性名
console.log(obj['a'])//10
console.log(obj[8])//100
//[]语法访问
//优先按照值的特性解析成对应的数据类型
//'a'被解析成字符串a 8被解析成数字8
//如果中括号内的值没有明显的数据类型的特点,就会被解析成变量
console.log(obj[a])//报错 变量a不存在
//当访问的属性名被保存在变量中时,则必须中括号语法
for(i in obj){
cnsole.log(i)//变量i代表属性名
cnsole.log(obj[i])//打印属性值
}
6.闭包引入
function f1(){
a++;
console.log(a);
}
f1();//11
f1();//12
f1();//13
//方法内对全局变量做操作
//全局变量易被修改,不安全
a=100;
f1();//101
function f2(){
var b=10;
b++;
console.log(b);
}
f2();//11
f2();//11
f2();//11
//局部变量在调用后会被销毁,操作不能复用
function fn(){
var a = 10;
return function(){
a++;
console.log(a);
}
}
var fn1 = fn();
fn1();//11
fn1();//12
fn1();//13
a作为局部变量,具有安全性
从结果11,12,13得出,方法具有复用性
分析:
1.使用执行的行数就是把out方法的放回值赋值给全局变量fn
即:
var fn=function (){
a++;
console.log(a);
}
2.细致分析
(1)代码第1行,声明函数fn,形成作用链
(2)代码第3行,声明匿名函数,形成作用域链
(3)代码第8行,执行fn函数,填充fn函数的作用域
(4)代码第8行,使用执行的行数就在使用它的返回值,给内层函数命名为fn1
(5)代码第8行,fn函数执行完毕释放自己的局部作用域,销毁局部变量a。但是由于被内层函数(fn1)引用着,释放失败,a得以保留
(6)代码第9行,执行fn1,填充fn1的局部作用域
执行fn1,使用变量a,自己的局部本不存在a,顺着作用域链向下找,在第二层fn的局部找到并使用a。fn执行完毕,释放自己的局部作用域,不会向下释放,所以a得以保留