作用域
1. 作用域
变量和函数都具有作用域。作用域就是变量和函数的可被访问的范围,控制着变量和函数的可见性和生命周期。
变量的作用域可被分为全局作用域和函数作用域(局部作用域)。如果变量是被定义在全局作用域的话,在 JavaScript 代码中的任何位置都可以访问该变量;如果变量是被定义在指定函数内部的话,在 JavaScript 代码中只能在该函数内访问该变量。
函数的作用域也可被分为全局作用域和函数作用域(局部作用域)。被定义在指定函数内部的函数被称之为局部函数或内部函数。
值得注意的是: ECMAScript 6 之前的 JavaScript 没有语句块作用域。
2. 变量的作用域
2.1 全局变量
在所有函数之外声明的变量,叫做全局变量,因为它可被当前文档中的其他代码所访问。具体内容如下述代码所示:
var msg = "this is message";// 定义全局变量 msg
// 在全局作用域访问变量 msg
console.log( msg );// 输出 this is message
function fn(){
// 在函数作用域访问变量 msg
console.log( msg );// 输出 this is message
}
fn();
除了上述定义全局变量外,还有一种比较特殊的方式定义全局变量(具体用法如下述代码)。但这种特殊用法并不推荐!
function fun(){
// 定义变量时没有使用关键字 var
lala= "this is hahah";
// 在函数作用域访问变量 atguigu
console.log( lala);// 输出 this is hahah
}
fun();
// 在全局作用域访问变量 lala
console.log( lala);// 输出 this is hahah
2.2 局部变量
在函数内部声明的变量,叫做局部变量,因为它只能在该函数内部访问。具体用法如下述代码所示:
function fun(){
// 定义局部变量 neworigin
var lala= "this is haha";
// 在函数作用域访问变量 lala
console.log( lala);// 输出 this is haha
}
fun();
// 在全局作用域访问变量 lala
console.log( lala);// 输出报错
2.4 按值传递
按值传递就是指将实参变量的值复制一份副本给函数的形参变量。JavaScript 中为函数传递参数时,都是按值传递的。
如果向函数传递的参数是原始类型数据,则在函数中修改参数变量的值,不会影响外部实参的变量。
let n = 100;// 全局变量n
function fun( n ){// 参数变量也是局部变量
n -= 3;// 修改的是局部变量n
console.log( n );// 输出的是局部变量n
}
fun( n );// 按值传递,方法内输出 97
console.log( n );// 输出全局变量的值 100
3. 函数的作用域
3.1 全局函数
函数与变量类似,具有全局作用域和函数作用域(局部作用域)。与全局变量类似,全局函数是被定义在全局作用域的,在任何位置都可以访问或调用该函数。
function fn( num1, num2){
console.log( num1 + num2 );// 输出 3
}
fn( 1, 2 );
3.2 内部函数
function outer(){// 全局函数
function inner(){// 局部函数
console.log("inner");
}
inner();// 调用正常
}
inner();// 输出报错