JavaScript作用域问题

83 阅读2分钟

前端面试常见问题: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.作用域链

内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪一个值,这种结构就称为作用域链(就近原则)