龙空技术网

看了你就明白JavaScript 函数的解析机制了

优资源 98

前言:

此刻小伙伴们对“js函数编译”都比较着重,大家都需要了解一些“js函数编译”的相关知识。那么小编同时在网络上搜集了一些关于“js函数编译””的相关知识,希望小伙伴们能喜欢,姐妹们快快来学习一下吧!

首先我们要明白JavaScript的解析机制:

1、编译阶段(预处理或预编译):代码在执行时被解释器一行行编译和执行,在这个阶段JavaScript解释器将完成对js代码的预处理,也就是把js代码转化成字节码。

2、执行阶段:(JavaScript代码已经在内存中被构建为语法树,此时,js引擎会根据这个语法树结构边解释,边执行。)JavaScript解释器借助执行期环境,把字节码转换生成机械码,并按顺序执行,完成程序设计的任务。

其次:

JavaScript 的变量和函数作用域是在定义时决定的

看个例子:

console.log(a); //返回undefinedvar a = 1;console.log(a) ; //返回1

因为 JS在预编译时并没有赋值,二是在执行期再初始化值的,所以JS先执行输出a时,a并没有被定义,所以返回undefined.

同理:

f();var f = function(){ return 1;}

因为在预编译期f并没有初始化赋值,所以再执行的时候先执行f(),会报语法错误 f 不是个function

f()function f(){ return 1}

这个不会报错,因为JS在预编译期就把函数处理,那为什么var f = function(){ }没有处理呢?因为预编译JS对匿名函数视而不见,不处理它,所以在执行期执行f()时,内存中有了,所以不报错.

为了再进一步,举几个例子:

 var f = function(){ return 1; } console.log(f()); //返回1 function f(){ return 2; }; console.log(f()); //返回1

奇怪吧,联系上面的内容,想想:

预编译其处理了function f ,确定变量f的作用域,但没赋值,执行期function f被 var f = function 覆盖,所以返回1,执行环境类似这样执行

 function f(){ return 2; } console.log(f()); function f(){ return 1; }; console.log(f());

所以你知道下面的返回值了吧:

 console.log(f()); //返回2 var f = function(){ return 1; }; function f() { return 2; } console.log(f()); //返回1

标签: #js函数编译