前端面试常见问题:JavaScript的作用域
1.什么是作用域
简单通俗来说,作用域就是一个变量或者说某个变量的合法适用范围。
作用域存在的意义: 提高程序可靠性,减少命名冲突。
1.1全局作用域
常见全局作用域:
写在<script></script>中的js代码;单独js文件;全局作用域在页面打开时创建,页面关闭时进行销毁。全局作用域有一个全局对象window。
1.2函数作用域
变量只在函数内部存在。 这里会涉及变量提升和函数提升,要记住 ' 函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被同名变量赋值后覆盖 '。
console.log(a)
var a=1;
function a(){}
console.log(a) // 1
在进行变量提升和声明提升后
function a(){} // 函数声明提升 a-> f a (){}
var a; // 变量提升
console.log(a) // 此时变量a只是声明没有赋值所以不会覆盖函数a --> 输出函数a f a (){}
a=1; //变量赋值
console.log(a) // 此时变量a赋值了 --> 输出变量a的值 1
1.3块级作用域:(ES6新增)在花括号{}内部的作用域f语句和for语句里面的{ }也属于块作用域。
此处要注意var、let、const区别:
1.var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
2.let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
3.const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
2.作用域链
内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪一个值,这种结构就称为作用域链(就近原则)