【js】javascript变量声明优先级

来源:互联网 发布:任务计划 软件 编辑:程序博客网 时间:2024/04/29 14:00

javascript的作用域和hoisting,在里面我也提到了function声明的优先级比var声明高,也就意味着当两个同名变量同时被functionvar声明时,function声明会覆盖var声明,如下:

  1. alert(a);//输出:function a(){ alert('我是函数') }
  2.  
  3. function a(){ alert('我是函数') }//
  4. var a = '我是变量';
  5.  
  6. alert(a); //输出:'我是变量'

这代码等效于:

  1. function a(){alert('我是函数')}
  2. var a; //hoisting
  3. alert(a); //输出:function a(){ alert('我是函数') }
  4. a = '我是变量';//赋值
  5. alert(a); //输出:'我是变量'

这短短的代码里面其实说明了两个问题:

  • function声明的优先级高于var声明:第一个alert输出可以看出var a;function a(){}覆盖掉了。
  • 赋值优先于函数声明:第二个alert输出可以看出a='我是变量'又把function a(){}覆盖掉了。

把一个变量添加到作用域中除有很多方法,如下:

  • javascript语言预定义的,比如说this,arguments
  • formal parameter(也就是中文说的形参吧)
  • var声明并赋值,比如说var a = 10;
  • var声明不赋值,比如说var a;
  • function声明,比如说function a(){};

我们来看看他们之间的优先级:

  • var声明并赋值优先级高于function声明 这个上面已经说了。

  • function声明优先级高于formal parameter

  1. function fnTest(a){
  2. alert(a);
  3. function a(){return "我优先"}
  4. }
  5. fnTest(100);//:function a(){return "我优先"}。可以看出function声明覆盖了`formal parameter`。
  • formal parameter优先级高于预定义变量
  1. function fnTest(arguments){
  2. alert(arguments);
  3. }
  4. fnTest(100);//:100。说明`formal parameter`优先级比预定义的arguments高

对比以下:

  1. function fnTest(a){
  2. alert(arguments);
  3. }
  4. fnTest(100);//:[Object Arguments] {0:100,length:1}。当没有冲突时输出便是预定义的arguments
  • formal parameter优先级高于var声明不赋值
  1. function fnTest(a){
  2. alert(a);
  3. var a;
  4. }
  5. fnTest(100);//:100。很明显,不多说
  • 预定义变量优先级高于 var声明不赋值
  1. function fnTest(){
  2. alert(arguments);
  3. var arguments;
  4. }
  5. fnTest();//:[Object Arguments]。不是undefined,说明arguments没有被var声明覆盖
  • var声明不赋值优先级高于函数外部作用域的其他所有声明
  1. function fnTest(){
  2. alert(fnTest);
  3. var fnTest;
  4. }
  5. fnTest();//:undefined。

对比如下:

  1. function fnTest(){ //
  2. alert(fnTest); //
  3. } //
  4. fnTest(); //输出function fnTest(){alert(fnTest);}

这也正好印证了作用域链查找变量的方式:在局部作用域里查找(若找到则返回,不必往下继续查找) ==> 在上一级作用域里查找... ==> 直到全局作用域(若找不到则返回typeError)

最后看看下面的综合例子:

  1. function fnTest(arguments){
  2. alert(arguments);//function arguments(){return "hello world"}
  3. var arguments = 99;
  4. function arguments(){return "hello world"};
  5. alert(arguments);//99
  6. }
  7. fnTest(100);
0 0
原创粉丝点击