作用域是指对某一属性(变量)或方法(函数)具有访问权限的代码空间。在JavaScript中,作用域是在函数中进行维护的,即在下面这个函数中
function myFunction() { var myVariable = "inside"; } myFunction(); alert(myVariable);
同样地,在这种情况下执行这个函数不会影响到外部作用域:
function myFunction() { var myVariable = "inside"; } //定义变量 var myVariable = "outside"; //执行前面的函数 myFunction(); alert(myVariable); //将提示outside
在这个例子中,因为在函数内部使用了var关键字来维护作用域链,所以执行myFunction()函数对位于其外部作用域中的myVariable没有影响。如果在myFunction()内部去掉为myVariable赋值时使用的var关键字,那么myVariable的作用域将会解析到myFunction()的外部,因此就会修改外部的变量:
function myFunction() { //没有使用var myVariable = "inside"; } //定义变量 var myVariable = "outside"; //执行函数 myFunction(); alert(myVariable); //将提示inside
作用域链是用来描述一种路径的术语,沿着该路径可以确定变量的值(或者当函数被调用时要使用的方法)。当给myVariable赋“inside”值时,myFunction()的作用域中没有使用var关键字,因此赋值操作会沿着作用域链查找到执行myFunction()的作用域中(在这种情况下是window对象内部),并修改其中myVariable实例的值。从本质上说,var关键字决定了哪个函数是特定变量的作用域链的终点。同样的逻辑也适用于取得变量值的情况。
除了var关键字之外,像下面这样将变量包含在定义函数时的圆括号内,与使用var关键字的效果是相同的,即该变量也会被包含在函数的作用域内:function myFunction(myVariable) { ... }