JavaScript代码是由浏览器中的JavaScript解析器来执行的,JavaScript解析器在运行JavaScript代码的时候会进行预解析,也就是提前对代码中的var变量声明和function函数声明进行解析,然后再去执行其他的代码。
为了方便大家更好地理解,下面我们通过一段简单的代码来演示var 关键字的预解析效果。
// 以下代码中的var num变量声明会进行预解析 console.log(num); //输出结果: undefined var num = 10; // 以下代码由于不存在 var num2, 所以会报错 console.log(num2); //报错,提示num2 is not defined(num2未定义)
在上述代码中,第2行在变量num声明前就访问了变量num,但却没有像第5行的num2一样报错,这是因为第3行代码中的var num会被预解析,相当于如下代码。
var num; // num的变量声明由于预解析而提升到前面 console.log(num); //输出结果: undefined num = 10;
由此可见,由于num的变量声明被预解析,所以console.log(num)不会报错,并且由于赋值操作num = 10不会被预解析,所以此时num的值为undefined。
同样,JavaScript 中的函数也具有预解析的效果,示例代码如下。
fn(); function fn(){ console.log('fn'); }
在上述代码中,fn()函数调用的代码写在了函数声明的前面,但函数仍然可以正确调用,这是因为function函数声明操作也会被预解析。
需要注意的是,函数表达式不会被预解析,示例代码如下。
fun(); //报错,提示fun is not a function( fun不是一个函数) var fun = function() { console.log('fn'); }
上述代码提示fun不是一个函数, 这是因为var fun变量声明会被预解析,预解析后,fun的值为undefined,此时的fun还不是一个函数, 所以无法调用。只有第2~ 4行代码执行后,才可以通过fun()来调用函数。
本文来自:黑马程序员web前端培训 http://web.itheima.com