JavaScript scope(作用域)

Scope(作用域)


* 注:ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6 的到来,为我们提供了‘块级作用域’,可通过新增命令 let和 const 来体现。用 let 或 const 声明的变量和常量不会被 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

 

你可能感兴趣的:(js,javascript)