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