js词法分析

js ,变量的作用域链从函数内往外逐层寻找变量的声明或赋值,直到window,不能反过来,反过来要靠闭包。

变量赋值时如果没有声明过,有可能是全局变量window.变量名,很简单:

如果不加var,表示仅仅是一个赋值操作,但是也不能狭隘地理解为一个全局变量,比如有可能在外层函数里声明过。那就是外层函数的局部变量

先词法分析,再执行

如果在一个作用域中的变量既没有赋值也没有声明,则是报错is not defined,如果在作用域中声明过还没有执行到赋值语句,则是undefined类型

以window.xxx引用某变量,如果找不到,作为一个属性不存在,返回undefined

如果以xxx引用某变量,找不到就返回 变量 is not defined错误

function a(b){

  alert( b);

  function b(){

  alert(b);

  }

  b();

}

a(1);

分析过程:

0,形成活动对象AO={}

1,1.1分析形参,若有AO={b:undefined}

     1.2接收实参,AO={b:1}

2,分析var声明,如果和形参同名,则什么也不做,不同则增加一个属性

3,分析函数声明,如果和形参同名,则覆盖,多次声明就以最后一次为准,就算不同变量类型也可以改变AO={b:function b(){alert(b);}}

执行过程:顺序执行.

输出两次alert,内容是:

 function b(){

  alert(b);

  }

js被成为披着c外衣的Lisp语言,Lisp是一种强大的函数式语言,比较古老

是面向函数的,函数的地位比较高,可以作为参数来传递。

函数声明和函数声明表达式是不一样的,函数声明在词法分析阶段解释,函数表达式在执行阶段才发挥作用。毕竟他是一个表达式

 

作用域链,函数由内到外所产生的AO链,内层找不到的变量到外层AO去找,直到window

posted @ 2016-09-12 12:38  dreamerDu  阅读(211)  评论(0编辑  收藏  举报