全局、局部变量及作用域、作用域链

137 阅读2分钟

 全局变量:在函数外声明的变量,网页上的所有脚本和函数都能访问它 

 局部变量:在函数内部声明的变量(必须使用var) 

 全局变量 具有全局的作用域 

 let arr = [];

 局部变量 具有局部作用 

 arr只有变成全局的才不会被重复定义

let arr = []; 

 全局变量在页面关闭后被删除 

let str = '111'

function fn(){

 在函数里面没有使用let 或者 var 

 a会变成一个全局变量 

 局部变量:在函数内部声明的变量(必须使用var) 

 只能在函数内部访问它 

var a = '123'

console.log(a);

}

fn();

 console.log(a); 

 可以在不同的函数中使用名称相同的局部变量

function fn2(){

var a = '456';

console.log(a);

 局部变量在函数运行以后被删除 

}

fn2();

console.log(str);

作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期

变量的作用域有两种

全局作用域

局部作用域 

 a是全局变量具有全局作用域

let a = 123;

function fn1(){

 和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到

 b是局部变量 具有局部作用域 

let b = '222'

console.log(c);

 console.log(a); 

}

 fn1() 

 console.log(b); 

最外层函数和在最外层函数外面定义的变量拥有全局作用域

所有未定义直接赋值的变量自动声明为拥有全局作用域

 所有window对象的属性拥有全局作用域

window对象的内置属性都拥有全局作用域,

例如window.name、window.location、window.top等等

可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性该内部属性

包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域。

作用域链 首先会在当前的作用域内去变量对应的值

如果找不到,会向上一层一层的去寻找 。

【案例】

let str = 'abc'; 

 第一种方法 

 let s = ''

 for(var i=str.length-1;i>=0;i--){

 s+=str[i]

 }

 console.log(s);

 第二种方式 

 reverse把数组的顺序倒过来 

 console.log( str.split('').reverse().join('') ) 

 第三种方式 

 let arr = [];

 for(var i in str){

 arr.unshift(str[i])

 }

 console.log( arr.join('') );