美文网首页
ES6(一)—— 作用域

ES6(一)—— 作用域

作者: 顽皮的雪狐七七 | 来源:发表于2020-09-04 13:49 被阅读0次

告别拖延症,今天开始更新ES6-ES10常用的所有新特性,仅作为学习笔记,勿喷。

目录

  • 作用域
    • 全局作用域
    • 函数作用域
    • 块级作用域(ES6新增)
    • 动态作用域
  • ES6-ES10学习版图

作用域

  1. 全局作用域
  2. 函数作用域
  3. 块状作用域
  4. 动态作用域
对象 类型
global/window 全局作用域
function 函数作用域(局部作用域)
{} 块状作用域(if语句,for语句)
this 动态作用域

全局作用域

在全局使用var定义的变量为全局变量

案例一:

var abc = 1234
abcd = 2345

delete abc //false
console.log(abc) //1234
delete abcd //true
console.log(abcd) //abcd is not defined

// abc是一个全局对象,但是abcd不是全局变量,而是作为window对象的属性存在的,
// 但是因为window是全局对象,所以看上去它也具备全局属性,拥有全局作用域

案例二:

function test(){
    ab = 45
}
test()

console.log(ab) //45
//在函数内部没有使用var定义的变量,都挂载在window上,不是全局变量,但是拥有全局作用域

函数作用域

在函数内部定义的变量,拥有函数作用域/局部作用域

function test(){
    var a = 3
    return a + 4
}
console.log(test()) // 7 
console.log(a) //a is not defined

如何让a在函数作用域中,但是某些值共享?

  1. return
  2. 闭包

块级作用域(ES6新增)

ES5

// ES5
function test(){
    var a = 3
    if (a === 3) {
        var b = 4
        console.log('abc')
    } else {
        console.log('abcd')
    }
    console.log(b)  // 4
    return a + 4
}

//在if的块中无法形成壁垒,在{}中定义的变量在外界还是可以使用的
//ES6将{}中的东西进行了独立

function test () {
    var a = 3
    function test2 () {
        var b = 4
        return a + b
    }
    return test2
}

/* test里面的变量对test2是共享的,a的值是可以取到的。
根据函数的作用域链:
执行test2中的函数,首先定义b,然后return中找a,没有找到就去上一个函数中找,找到了a
如果在test中找不到a,最后会一直找到window
*/ 

ES6

function test(){
    var a = 3
    if (a === 3) {
        let b = 4
        console.log('abc')
    } else {
        console.log('abcd')
    }
    console.log(b)  // b is not defined
    return a + 4
}

// 如果想要使用块状作用域,但是此时不能用var,因为var有一个变量提升机制。
// 但凡看到了var,就会提升到当前作用域最顶层,所以只能使用let,const

动态作用域

this 是非常特殊的关键词标识符,在每个函数的作用域中被自动创建。
只能在执行阶段才能决定变量的作用域。

window.a = 3
function test () {
    console.log(this.a)
}
test()  // 3
test.bind({ a:100 })()  // 100

// 因为this是一个动态指向,不是固定指向。所以我们称这个为动态作用域。
// bind是让函数动态绑定到一个对象上去,这个时候this指向对象本身,所以会导致同一个函数有不同的效果。

词法作用域

  • js采用词法(静态)作用域,因此开启动态作用域请借助bind,with,eval等。
  • bash采用的是动态作用域
静态作用域 动态作用域
变量的作用域是在定义时决定而不是执行时决定,一般通过静态分析就能确定。 只能在执行阶段才能决定变量的作用域。
// 经过验证,js默认采用静态作用域
// a 在foo调用的时候没有在当前函数作用域中找到,所以按照书写代码顺序往外层找,就是var a = 2,而不是取bar函数里面找
function foo() {
    console.log(a)  // 2
}

function bar() {
    var a = 3
    foo()
}

var a = 2
bar()

学习版图

学习版图

相关文章

  • js 作用域链 和 原型链

    作用域链 js拥有全局作用域(window)、函数作用域、块级作用域(es6)。块级作用域是es6开始才拥有的,因...

  • JS基础知识(2) -- 作用域和作用域链

    作用域 作用域就是变量与函数的可访问范围 全局作用域 函数作用域 ES6块级作用域 ES5没有块级作用域,ES6有...

  • ECMAScript 6.0 作用域

    ES6中对作用域有了一个明确的界限,作用域指的是“块”作用域 // ES5 中作用域 //ES6 用 const ...

  • 13 丁老师讲解 es6练习题

    es 全称是? ECMAscript es6之前的作用域有哪些?全局作用域函数作用有 es6引入了什么作用域?块级...

  • ES6语法

    一、let和const es6之前有两个作用域:全局作用域、函数作用域es6新增加了块作用域,也就是{}包起来的代...

  • let 和 const

    一、JS中的块级作用域 ES6之前JS不支持块级作用域在ES6之前,JS是没有块级作用域这个概念的,只有全局作用域...

  • JavaScript块级作用域

    块作用域{ }JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称ES6)中...

  • javascript的三种作用域

    javascript 三种作用域 全局作用域 函数作用域 块级作用域(es6) 全局作用域 变量声明不写在函数内部...

  • JS--作用域和闭包

    作用域 1、全局作用域2、函数作用域3、块级作用域(ES6新增)if(true){let x = 100}cons...

  • es6-let与const

    作用域的概念 es5 两个作用域:全局作用域、函数作用域 es6 增加了块作用域 let let var 作用域不...

网友评论

      本文标题:ES6(一)—— 作用域

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