JavaScript scope(作用域)

本文介绍了JavaScript中的作用域概念,包括全局作用域、函数作用域以及ES6引入的块级作用域。通过let和const关键字实现块级作用域,并讨论了变量提升。此外,解释了函数作为闭包的角色,如何在函数内部访问外部作用域的变量。最后提到了严格模式下对全局变量的影响以及支持严格模式的浏览器版本。
摘要由CSDN通过智能技术生成

Scope(作用域)


* 注:ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6 的到来,为我们提供了‘块级作用域’,可通过新增命令 letconst 来体现。用 letconst 声明的变量和常量不会被 hoisting(提升)!

1. 什么是作用域

  • 当前的执行上下文。 和表达式在其中“可见”或被访问到的上下文。如果一个 变量 或者其他表达式“在当前的作用域中”,那么它就是不可用的。作用域也可根据代码层次分层,以便子作用域可以访问父作用域,通常是指沿着链式的作用域链查找,而不能从父作用域引用子作用域中的变量和引用。
  • 函数在JavaScript中充当闭包,一个 function 将生成一个闭包(通常是返回一个函数引用),因此创建了一个作用域,这个函数引用从外部作用域(在当前环境下)可以访问闭包内部的作用域。函数中专门定义的变量不能从函数外部或其他函数中访问。例如,以下是无效的(下面代码不是闭包形式):
function exampleFunction(){
    //x只能在 exampleFunction 函数中使用
    var x = "declared inside function";
    console.log("Inside function");
    console.log(x);
}

//引发error
console.log(x);

 

  • 但是,由于变量在函数外被声明为全局变量,因此在下面的代码是有效的(当前作用域不存在的变量和引用,就沿着作用域链继续寻找):
var x = "declared outside function";
exampleFunction();

function exampleFunction(){
    console.log("Inside function");
    console.log(x);
}

console.log("Outside function");
console.log(x);
  •  将尚未声明的变量赋值,此变量会自动成为全局变量。例如,下面的代码声明一个全局变量 carName,即是在函数内执行了赋值

     

exampleFunction();

//此处的代码能够使用 x 变量

function exampleFunction(){
    x = "hello";
}
  • 补充,当一个函数(foo)执行返回一个内部函数(bar)引用时,bar 将会保存 foo 的作用域引用。例如:
function foo(){
    const str = "bar in foo";

    return function bar(){
        return str;
    }

}

var fun = foo();
fun();//"bar in foo"

* 注:所有现代浏览器都支持 “严格模式” 运行 JavaScript。在“严格模式“中不会自动创建全局变量。通过在脚本或函数的开头添加 "use strict"; 来声明严格模式。以下版本浏览器支持 “严格模式”

  •  版本 10 以后的 IE
  •  版本 4 以后的 Firefox
  •  版本 13 以后的 Chrome
  • 版本 5.1 以后的 Safari
  • 版本 12 以后的 Opera

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值