首页 > js的词法分析

js的词法分析

x();
var x = function(){
    console.log(1);
}

function x(){
   console.log(2);
}
x();

像这种先输出 2 在输出 1,词法分析我理解的过来,我就想知道在词法分析后,函数正式执行的时候,函数声明式

function x(){
   console.log(2);
}

是不是就不再执行了,函数表达式还会执行

var x = function(){
    console.log(1);
}

x(1);//1 输入的结果是 function x(x){...}执行结果,因为函数定义式提升了
var x = function(x){
console.log(x);
}

function x(x){
   console.log(x);
}
x(2)    //2 执行的是var x=function(x){...}定义的函数结果  
        //可以理解为就近原则(不是肉眼的就近,因为函数 
        //定义方式提升了,x(2)靠近了var x=function(){...} );

第二种

x(1);//undefined  因为var x=function(){} 不会提升 
var x = function(x){
console.log(x);
}
x(2) //2 

希望对你有帮助


x();
var x = function(){
    console.log(1);
}

function x(){
   console.log(2);
}
x();

這道題和編譯原理無關,純粹是由於以上內容等價於

var x;
x = function(){
   console.log(2);
}
x();
x = function(){
    console.log(1);
}
x();

實際上就是函數聲明提升。
js 詞法分析結束並不能確定調用的函數到底是啥,得到運行時才能確定(這也是優化困難的原因之一)


函数定义语句function x(){console.log(2)}是在解析时在内存中构建;
而函数表达式x = function(){console.log(1)}则是在运行时进行运算的。

至于词法分析只是解析过程的第一步而已,与函数定义语句 和 函数表达式是如何构建没有什么关系

【热门文章】
【热门文章】