Javascript疑问五:作用域链
?什么是作用域链,如何确定变量的的作用域
?我们在写代码的过程中,如何合理的定义变量的作用域
?全局作用域 & 某文件内的作用域
【1】javascript DOM 高级程序设计
作用域链是用来描述一种路径的术语,沿着该路径可以确定变量的值,或者当函数被调用时要使用的方法。
- 从本质上说,var关键字决定了哪个函数是特定变量的作用域链的终点。
- 没懂,作用域链的终点是函数?
- 将变量包含在定义函数时的圆括号内,与使用var关键字效果相同,即该变量也会包含着函数的作用域:
- funciton myFunction(myVariable) {...}
function myFunction(){ var myVariable = 'inside'; //local variable } console.log(myVariable); //'undefied' var myVariable = 'outside'; //global variable myFunction(); console.log(myVariable); //'outside' function myFunction2(){ myVariable = 'inside'; //global varabile console.log('funciton2: ' + myVariable); } var myVariable = 'outside'; //global varabile myFunction2(); console.log(myVariable); //'inside'
【2】http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html
全局作用域
(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域
(2)所有末定义直接赋值的变量自动声明为拥有全局作用域(就是【1】中说的没有使用var关键字定义的变量)
(3)所有window对象的属性拥有全局作用域,window.name、window.location、window.top等
局部作用域: 函数内部使用var关键字定义的变量,和函数内部定义的函数
这篇文章【2】用图片形象解释了函数执行过程中,标示符搜索的过程。
“在函数执行过程中,每遇到一个变量,都会经历一次标识符解析过程以决定从哪里获取和存储数据。该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没找到继续搜索作用域链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义。函数执行过程中,每个标识符都要经历这样的搜索过程。”
考虑到标示符的搜索过程,我们在写代码的时候,“尽量少使用全局变量”,“一个好的经验法则是:如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。”