大家好,我是珂圩
作用域在javascript中属于比较重要的部分
当面临一道代码题的时候,问你输出什么?简单的还行凭借我们的经验一眼就可以看出来
但是如果一道多变量再加上嵌套比较深的代码题的时候。
你可能也会迷迷糊糊,”啊~~ 应该是输出这个吧。“
这篇文章就让你去掉这个 ”啊~~“,坚定的说:就是输出这个!!!
什么是作用域
作用域就像是一个容器,用来存放变量并规定它们的使用规则。它决定了哪些地方可以使用哪些变量,以及变量在程序中的生命周期。作用域的存在是为了防止变量之间的混淆,让代码更易读、易维护,并确保变量的安全性。
作用域一共分为两大块
- 全局作用域
- 局部作用域
这里你可能就会说:还有块级作用域,函数作用域,词法作用域
对,是还有这些作用域,但本质上仍然是全局作用域和局部作用域的扩展或细分,这些下面我们都会讲到
全局作用域
任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问
var x = 10; // 在全局作用域中声明变量 x
function test() {
console.log(x); // 在函数内部可以访问全局作用域中的变量 x
}
test(); // 调用函数 test
console.log(x); // 在函数外部也可以访问全局作用域中的变量 x
函数作用域
函数作用域也叫局部作用域,如果一个变量是在函数内部声明的,它就在一个函数作用域下面。这些变量只能在函数内部访问,不能在函数以外去访问
function test() {
var x = 10; // 在函数作用域中声明变量 x
console.log(x); // 输出 10
}
test(); // 调用函数 test
console.log(x); // 在函数外部无法访问变量 x,会报错:ReferenceError: x is not defined
块级作用域
ES6引入了let和const关键字,和var关键字不同,在大括号中使用let和const声明的变量存在于块级作用域中。在大括号之外不能访问这些变量。
function test() {
if (true) {
let x = 10; // 在 if 块级作用域中声明变量 x
console.log(x); // 输出 10
}
console.log(x); // 在函数作用域中无法访问变量 x,会报错:ReferenceError: x is not defined
}
test();
作用域的优先级
当我们了解完这些作用域之后呢,我们来考虑下面这块代码
var x = 'I am global';
function x() {
var x = 'I am outer';
if (true) {
let x = 'I am block';
console.log(x);
}
console.log(x);
}
x();
console.log(x);
现在所有的变量名都叫x,那我们如何得知不同的地方的输出结果是什么呢?
下面我们就来说一说优先级,也就是如何来对比不同地方对x的权重
- 内部作用域优先于外部作用域
- 块级作用域优先级高于函数作用域
掌握这两点后你再去看一下上面的代码题,是否能坚定的说出:“就是输出这个!!!”
作用域链
当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域
如果在全局作用域里仍然找不到该变量,它就会在全局范围内隐式声明该变量(非严格模式下)或是直接报错
作用域链并不是指某一个东西,而是寻找的这个链路叫做作用域链
Global Scope
↓
outerFunction Scope
↓
innerFunction Scope
后面我会去建立一个仓库,里面针对于每期的知识点出一些题供大家练习,希望大家持续关注这个系列!!!
结语
文章中提到的技术点,如果有不懂得或者想要了解更多的评论区告诉我,我会针对性的出一期更详细的文章。
如果此文章对你有帮助,点个赞支持一下
后续还会不定时出一些文章或针对某个领域的系列文章
有兴趣的可以关注一下!