JS面试题

一、JS作用域

什么是作用域?通俗来说就是代码名字(变量)作用的范围。
作用域的目的:是为了提高程序的可靠性,更重要的是减少命名冲突
JS作用域可以分为:全局作用域 、局部作用域(函数作用域)、块级作用域(ES6)
(一)全局作用域:
  直接编写在 script 标签之中的JS代码,都是全局作用域;或者是一个单独的 JS 文件中的。全局作用域在页面打开时创建,页面关闭时销毁;
在全局作用域中有一个全局对象 window(代表的是一个浏览器的窗口,由浏览器创建),可以直接使用。

//在全局作用域中,
//所有创建的变量都会作为 window 对象的属性保存。
var a = 10
console.log(window.a)//10
function fn() {
   console.log('我是function');
}
window.fn()//我是function

(二)局部作用域(函数作用域):
  在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用调用函数时创建函数作用域,函数执行完毕之后,函数作用域销毁;每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。

在这个例子里面 fn函数里面的 局部作用域中 有一个 num 变量, script
标签的全局作用域中也有一个 num变量。( 一个在全局作用域下, 另一个在局部作用域下, 虽然两个变量的变量名相冲突, 但是并没有影响。)所以, 在不同的作用域下, 变量名相同也不受影响, 这样就很有效的减少了命名冲突。

var num = 10;
function fn(){
	var num = 20
	console.log(num)
}
fn()
console.log(num)
//打印结果为
20
10

块级作用域
凡是带{}都是块级作用域,if(){} for(){} 对象{}
1.在块级作用域下,var 和function跟在window下一样, function有个特殊的一点,在块级作用域下会提前声明,不会提前定义
在这里插入图片描述
2.在块级作用域下 let和const声明的变量是私有的,外面访问不到
在这里插入图片描述

3.for循环下let声明的变量不会泄露
在这里插入图片描述
在这里插入图片描述

二、闭包

当一个函数的返回值是另一个函数,而返回的那个函数调用了其父函数的内部变量,切返回的那个函数在外部被执行,就产生了闭包
举个例子:

function fun(){
	let a = 100;
	return function(){
		cosole.log(a)
	}
}
let fn = fun()
let a = 200
fn()//100

//传一个函数作为参数
function fun(){
	let a = 200
	console.log(a)
}
let a = 100
function fn(){
	console.log(a)
}
fun(fn)//100

优点:
​ 1.避免全局变量的污染
​ 2.变量长期存储的内存中

​缺点:
​ 1.使用不当会造成内存泄漏
​ 如果闭包使用不当,就会导致变量不会被垃圾回收机制回收,造成内存泄露
​ 2.不能及时释放内存
​ 3.捕获的变量是引用,不是复制
​ 4.父函数每调用一次就会产生一次闭包

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值