美文网首页JavaScript
我眼中的JS作用域

我眼中的JS作用域

作者: CodorMonkey | 来源:发表于2018-05-15 10:54 被阅读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);
}

非常简洁~

相关文章

  • 变量作用域

    变量作用域:静态作用域、动态作用域JS变量作用域:JS使用静态作用域JS没有块级作用域(全局作用域、函数作用域等)...

  • 我眼中的JS作用域

    作用域分类 1.全局作用域2.函数作用域3.块级作用域(ES6新增) 什么是全局作用域? 1.最外层的变量、函数2...

  • JS作用域的练习

    Js作用域练习demo1 Js作用域练习demo2 JS作用域练习demo3 JS作用域练习demo4 JS作用域...

  • 你不知道的JS-上卷

    作用域整体理解:JS作用域分为函数作用域,全局作用域,with和try catch形成的块级作用域。 JS引擎在编...

  • js 闭包

    一、js 作用域 讲闭包首先就要理解 js 的作用域。再 ES5 中,js 有两种作用域,全局作用域和函数作用域(...

  • 2019-08-13JS里面的作用域Scope

    作用域指一个变量的作用范围。 JS的作用域 在JS中,有两种作用域 全局作用域直接编写在script标签中 JS代...

  • 干货!月薪80k前端大佬面试笔记:JS闭包解析!

    三点注意事项 JS没有块级作用域,只有全局作用域和局部作用域(函数作用域)。 JS中的作用域链,内部的作用域可以访...

  • JavaScript作用域的理解

    作用域:就是起作用的区域。JS的作用域规定了变量和函数可访问的范围。JS作用域分为:全局作用域和局部作用域 全局作...

  • JS 作用域链、导入导出

    1. JS 的作用域链 作用域在 JS 中表示变量的可访问性和可见性。JS 作用域有 3 种:1. 全局作用域;2...

  • JS的作用域

    JS的作用域: 全局作用域、函数作用域、eval 作用域、块级作用域 全局作用域: 函数作用域: 结果截屏: 说...

网友评论

    本文标题:我眼中的JS作用域

    本文链接:https://www.haomeiwen.com/subject/tljedftx.html