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】用图片形象解释了函数执行过程中,标示符搜索的过程。

“在函数执行过程中,每遇到一个变量,都会经历一次标识符解析过程以决定从哪里获取和存储数据。该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没找到继续搜索作用域链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义。函数执行过程中,每个标识符都要经历这样的搜索过程。”

考虑到标示符的搜索过程,我们在写代码的时候,“尽量少使用全局变量”,“一个好的经验法则是:如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。

 

posted on 2013-08-10 08:29  wxb007  阅读(205)  评论(0编辑  收藏  举报