理解JavaScript的变量,变量作用域,作用域链
程序员文章站
2022-06-08 20:46:24
1. javascript的变量分为两种:
全局变量(global variable):可以在脚本的任何位置被引用。 局部变量(local variable):只存在于声明它的那...
1. javascript的变量分为两种:
全局变量(global variable):可以在脚本的任何位置被引用。 局部变量(local variable):只存在于声明它的那个函数的内部,这个函数之外是无法引用的。2. 关键字var设定了变量的作用域:
使用var声明变量那么这个变量就是局部变量。javascript的全局变量是全局对象的属性。当使用var声明一个变量时,这个变量时无法通过delete运算符删除的。如:
var m =1; //t是一个不可删除的全局变量 n = 2; //创建全局对象的一个可删除的属性 this.t = 3; //创建全局对象的一个可删除的属性 delete m//false:变量没有被删除 delete n//true:变量被删除了 delete this.t //true:变量被删除了没有使用var就是一个全局变量。 如:
function square(num){ global = num * num; //global是一个全局变量 return global; } var local = 50; //local是一个局部变量 var number = square(20); //number是一个局部变量 alert(global); //结果:400
3. 执行环境(execution context):每个执行环境都有一个与之关联的变量对象,环境中定义的所有的变量和函数都保存在这个变量对象中。
全局执行环境是最外围的一个执行环境,在web中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。
4. 作用域链(scope chain):javascript中每个函数都有一个执行环境,当代码在一个环境中执行时,就会创建变量对象的作用域链。
作用域链用途:保证对执行环境有权访问的变量和函数的有序访问。 如果这个环境是函数,则将其活动对象作为变量对象。 作用域链的前端,始终都是当期那执行环境的代码所在的变量对象。作用域链中的下一个变量对象来自包含(外部)环境,而在再下一个变量对象则是来自下一个包含环境,这样一直延续到全局执行环境。 全局执行环境的变量对象始终都是作用域链中的最后一个对象。5. 在javascript的最顶层代码,也就是不包含在任何函数定义内的代码,作用域链由一个全局对象组成。
在不包含嵌套的函数体内,作用域链上有两个对象:(1)定义函数参数和局部变量对象。 (2)全局对象。 在一个嵌套的函数体内,作用域链上至少有三个对象。6. 理解作用域链:当定义一个函数时,它实际上保存一个作用域链,当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加到保存它的作用域链上。
7. 内部环境可以通过作用域链访问所在的外部环境,但是外部环境不能访问内部环境的任何变量和函数。
例如:
var color1 = "blue"; function changecolor(){ var color2 = "red"; function swapcolor(){ var temp = color2; color2 = color1; color1 = temp; //这里可以访问color1,color2,temp //(即swapcolor这个函数作用域内) } //这里可以访问color1,color2,但是不能访问temp //(即在changecolor这个大函数的作用域内) swapcolor(); } //这里只能访问color1 (即全局作用域) changecolor();