看代码实例1
var a=1; function m(a){ //此处为形参第一个传入函数的参数,既为arguments[0] alert(a); //此处a为与形参绑定的 } m(a);//1 此时的a为把变量a当作参数传入函数 ....................................................................................................... var a=1; function m(a){ alert(a); } m();//undefind 因为没有传入参数 所以与函数内a绑定的为空,因此alert一个undefined
代码实例2
var a=1; function m(){ //函数创建时就将会将创建环境中的一些变量和对象保存在自己的作用域中,这也就是说函数的定义域取决于定义的位置,这就是语义化作用域,区别于c语言的块级作用域 alert(a); alert(b); } function n(){ var a=5; var b=3;// m(); } n();// alert a为1,到b时报错 is not defined m();// alert a为1,到b时报错 is not defined
可见函数m在创建时,已经将自己绑定到创建环境的作用域中,此处既为全局作用域,当在函数n中调用时,它并不会向函数n的私有作用域内去寻找变量,所以函数n内定义
的a和b不会出现在函数m的作用域链中,结果如代码中注释所示。
代码实例3
var a=1; function m(a){ //此处的a和函数里面的a都为形参,与第一行声明的a变量没有任何关系,它们没有实例2中的绑定关系 alert(a); } function n(){ var a=5;// m(a);//将变量a传入函数m,当需要alert a时,就会将a的值alert, } n();//5 m();//undefind
此处因该区分形参与变量的区别。
关于匿名函数的作用域更加复杂,等睡个好觉再起床整理一下。
原文:http://www.cnblogs.com/xueandsi/p/5965733.html