> 娱乐
javascipt中的函数(js函数详解)
导语:看了你就明白JavaScript 函数的解析机制了
首先我们要明白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
本文内容由小碧整理编辑!