视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
深入学习es6作用域
2020-11-03 23:08:32 责编:小采
文档


全局作用域

变量在函数外定义,即为全局变量。
全局变量有全局作用域: 网页中所有脚本和函数均可使用。
如果变量在函数内没有声明(没有使用var关键字),该变量为全局变量。

// 以下实例中 carName 在函数内,但是为全局变量。
// 此处可调用 carName 变量
 
function myFunction() {
 carName = "Volvo";
 // 此处可调用 carName 变量
}
在函数内部或代码块中没有定义的变量上是作为 window/global 的属性存在,没有使用 var 定义的变量可以被 delete 的,而全局变量不可以。

函数作用域

函数内部声明的变量,称为函数作用域。函数内部的变量外部无法
直接访问,可以通过retun 或者闭包的方式去访问。

// 此处不能调用 carName 变量
function myFunction() {
 let carName = "Volvo";
 // 函数内可调用 carName 变量
}
<!--rerurn-->
function myFunction() {
 let carName = "Volvo";
 rerurn carName;
 // 函数内可调用 carName 变量
}
let fn=myFunction()//Volvo;

<!--闭包-->
function myFunction() {
 let carName = "Volvo";
 function getName(){
 console.log(carName)
 }
 return getName();
 // 函数内可调用 carName 变量
}
myFunction() //Volvo

块级作用域

es6出现后,用let命令新增了块级作用域,外层作用域无法获取到内层作用域,非常安全明了.即使外层和内层都使用相同变量名,也都互不干扰。

关于暂时性死区
* 在使用let命令声明变量之前,该变量都是不可用的。如果去调用这种情况被称为暂时性死区。
let 特性
* let不存在变量提升
* let不允许重复声明
* 拥有块级作用域
* 不可以使用window去调用
const 特性
* 定义常量
* 不允许修改常量的值
* 不允许先声明后赋值
* 同上
if(1){
 let a = 1
 console.log(a)
}

动态作用域

动态作用域不关心函数和作用域是如何声明以及在何处声明的,只关心它们从何处调用。和this的机制就很像;
其实这里就有延伸出js的词法作用域(静态作用域),而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的

let name='youzi';
function getName(){
 let name="tuzi";
 function getAge(){
 console.log(name)
 }
 return getAge();
}
getName() //tuzi

词法作用域

JavaScript采用的是词法作用域,函数的作用域在函数定义的时候就决定了。

<!-- 这段代码执行就是按照词法作用域去执行的。在函数定义时已经被决定了 -->
let name='youzi';

function getName(){
 console.log(name)
}
function getAge(){
 let name='tuzi';
 getName()
}
getAge() //youzi

本文来自 js教程 栏目,欢迎学习!

下载本文
显示全文
专题