参数传递--函数声明与变量声明优先级?

javascript是一门解释性语言,自然没有编译过程,但在脚本执行之前会有语法检查和执行环境的构建,我们把这一过程姑且称为预处理吧。

一、函数声明,javaScript解析器把函数提升

fn();  //output  2

var fn= function(){

console.log(1);

}

 

function fn(){

console.log(2);

}

fn();  //output  1

首先,后面的fn()函数声明提前,所以第一个fn() 为2

其次,后面定义的fn()覆盖前面声明的函数,所以后面执行的函数为字面两定义的函数,结果为1

函数定义、函数声明、arguments三者优先级?

function   fn(t){                   

   t();                                         @1 var t

  function t(){                        @2.var t=function(){console.log(1)}

    console.log(2);                  @3.var t=function(){consol.log(2)};

        }                                                        @4.t();

    

   var t = function(){      

        console.log(3);      

    }  

console.log(t);

    }  

    fn(function(){console.log(1)});  //output  2

                                                        //output    function(){console.log(3);}

@1.变量声明var t提升到最顶端

@2.arguments中变量首先会覆盖var方式声明的变量(变量声明提升)

@3.函数声明覆盖相同名字的变量

优先级:函数形参>函数声明>变量声明(当变量声明遇到已经有同名的时候,不会影响已经存在的属性)

函数形参---->名称和对应值组成的一个变量对象被创建,如果没有传递对应参数的话,那么由名称和undefined值组成的一种变量对象的属性也被创建

函数声明---->名称和对应值(函数对象)组成的一个变量对象的属性被创建,如果变量对象已经存在相同的名称属性,则完全替换这个属性

变量声明---->名称和对应值(undefined)组成一个变量对象的属性被创建,如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的对象

function aa(a,b,c){  @1.a=1  b=2  c=3  @2.a=function a(){}  @3.var a; var aa变量声明提升

         function a(){}                      

         console.log(a);                           

         console.log(aa);

         console.log(arguments);

         var a='ee';

         var aa='444';

         arguments=6;

         console.log(a);

         console.log(aa);

         console.log(arguments);

}

aa(1,2,3);

输出结果:

function a(){}

undefined

[function, 2, 3]

ee

444

6

原文地址:https://www.cnblogs.com/jiechn/p/4140470.html