我眼中的JS作用域

2 篇文章 0 订阅
作用域分类
1.全局作用域
2.函数作用域
3.块级作用域(ES6新增)

什么是全局作用域?
1.最外层的变量、函数
2.未定义直接赋值的变量(不建议这么做!严格模式会报错!)
没啥好说的~

什么是函数作用域?
1.函数内部代码块,能够嵌套
注意点:JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里
下面是代码亲测:


输出结果:
① 'global'
解析:echo函数在全局作用域定义(name=‘global'),调用处在env函数作用域内(name='env'),结果为'global',可以看出,函数运行时的作用域为定义时的作用域。
②③ 'env'
解析:两处调用的是同一个函数(都是innerEnv,定义处name=‘env’),但是它们调用处的作用域不一样,②处name='env',③处name='global',而调用结果都为'env',再次说明,函数运行时的作用域为定义时的作用域。

什么是块级作用域?
1.let、const定义的变量
// 代码展示
{
  var a = 'var';
  let b = 'let';
  const c = 'const';
}

console.log(a);
// console.log(b); // 报错,b is not defined
// console.log(c); // 报错,c is not defined
块级作用域小技巧
for (var i = 0; i < 5; i++) {
  setTimeout(function () {
    console.log(i);
  }, 100);
}

上面这段代码本意是输出:0 1 2 3 4,结果输出:5 5 5 5 5,批量绑定DOM事件时很常见(当然,用事件委托可能更好)

没有块级作用域之前,使用自执行函数解决:

for (var i = 0; i < 5; i++) {
  (function (i) {
    setTimeout(function () {
      console.log(i);
    }, 100);
  })(i);
}

有了块级作用域之后,是这样的:

for (let i = 0; i < 5; i++) {
  setTimeout(function () {
    console.log(i);
  }, 100);
}
非常简洁~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值