时间:2021-07-01 10:21:17 帮助过:13人阅读
var color = "blue";function changeColor(){ var anotherColor = "red"; function swapColors(){ var tempColor = anotherColor; anotherColor = color; color = tempColor; // 这里可以访问color、anotherColor和tempColor } // 这里可以访问color和anotherColor,但不能访问tempColor swapColors();}// 这里只能访问colorchangeColor();
二.延长作用域链
有的语句可以在执行的时候在作用域的栈前端加临时入一个变量对象,在语句执行完毕后清除,从而使作用域得到延长,下列两个语句会延长作用域:
1.try-catch语句的catch语句
2.with语句
如:
function buildUrl() { var qs = "?debug=true"; with(location){ var url = href + qs; } return url;}
在此,with语句接收的是location对象,因此其变量对象中就包含了location对象的所有属性和方法,而这个变量对象被添加到了作用域链的前端。buildUrl()函数中定义了一个变量qs。当在with语句中引用变量href时(实际引用的是location.href),可以在当前执行环境的变量对象中找到。当引用变量qs时,引用的则是在buildUrl()中定义的那个变量,而该变量位于函数环境的变量对象中。至于with语句内部,则定义了一个名为url的变量,因而url就成了函数执行环境的一部分,所以可以作为函数的值被返回。
三.无块级作用域
1.在其他语言中,花括号括起来的都是变量的作用域,比如循环语句等等,但是js是没有块级作用域的。
2.js在声明变量时,如果没有加var,默认的是全局变量。
3.js查询标识符,顺序是先在局部作用域中查询,后在全局作用域中查询。
如:
var color = "blue";function getColor(){ var color = "red"; return color;}//"red"alert(getColor());