01-作用域
第7章 作用域
作用域决定了变量、常量和参数被定义的时间和位置。前面已经接触过作用域:知道函数参数的作用域仅限于函数体中,来看一个例子:
function f(x) {
return x + 3;
}
f(5); // 8
x; // ReferenceError: x 未定义
单从代码上看, x 的的确确存在过(否则它就没法计算出 x+3 的值),但很快就会看到,在函数体外引用 x 的时候会报错。因此, x 是函数 f 的一个内部变量,它的作用域就是函数f。
当某个变量的作用域是一个给定的函数时,必须要记住:形参只有在函数被调用的时候才存在(变成实参)。一个函数可能会被调用多次:每次函数调用开始时,参数才是真实存在的,在函数返回后参数就失去作用域了。
另外,变量和常量也只有在创建后才存在。也就是说,在使用 let 或 const 声明之前,它们是没有作用域的( var 是一个特例,本章后面会讲到)。
在一些编程语言中,声明和定义之间存在明确的区分。比较典型的是,声明一个变量意味着只是给它指定一个标识符来宣称它的存在。另一方面,定义通常意味着声明后还会赋值。在JavaScript中,这两个术语是可以互换的,因为所有变量都会在声明的时候给定一个值(如果没有显式赋值,会有一个隐含值 `undefined` )。
在一些编程语言中,声明和定义之间存在明确的区分。比较典型的是,声明一个变量意味着只是给它指定一个标识符来宣称它的存在。另一方面,定义通常意味着声明后还会赋值。在JavaScript中,这两个术语是可以互换的,因为所有变量都会在声明的时候给定一个值(如果没有显式赋值,会有一个隐含值 `undefined` )。