学习javascript中遇到了这么一个问题,代码如下:
var test = 'a';
function test() {
alert('Hello World!');
}
alert(test); //这句话打印出a
test(); //这句话报错:缺少函数
根据之前的知识函数就是对象,test开始赋值'a',后来又指向了一个函数,那么alert(test)应当打印出test函数内容。
而如下两种方式的代码符合我们的期望:
var test = 'a';
test = new Function("alert('Hello World!')");
alert(test);
test();
var test = 'a';
test = function() {
alert('Hello World!');
}
alert(test);
test();
后来查资料知道虽然第一种和后面两种声明函数的方式在逻辑上是等价的,但是有着如下区别:
第一种函数会在代码执行以前被加载到作用域中,而后两种则是在代码执行到那一行的时候才会有定 义,这就解释了为什么test()报错的原因:因为test()函数先加载到作用域中,执行到var test = 'a'时将test函数覆盖,所以出现了上面的现象。
同时通过这段代码还得出一个区别:
函数声明会给函数指定一个名字,而函数表达式则是创建一个匿名函数,然后将这个匿名函数赋给一个变量。