console.log(a);
var a=2;
它会被处理成这个样子
var a;
console.log(a);
a=2;
同样的 var a;是编译,后面两句是执行,因为a=2赋值是在打印之后,所以这段代码会输出 undefined.。
从上面两段代码就可以知道 以var这样声明的变量,放到哪里都会在编译阶段被移动到当前作用域的最上面。
函数提升
函数的声明跟变量声明也是一样会被提升,下面看函数的实例:
hello();//执行
function hello(){//函数声明,这里可以看到声明在后,执行在前,能正常执行吗?
console.log(‘hello’);
}
我们运行这段代码,可以看到是正常输出的,也就是函数声明被提升了。
那如果我们用var 来声明函数会怎么样呢?
hello();//执行
var hello = function (){
console.log(‘hello’);
}
执行会报错:
为什么呢?因为 var hello = function (){
console.log(‘hello’);
} 这样写的话var hello是变量声明,后面的是赋值操作,变量被提升了,赋值操作是没有被提升的,其实这段等同于这样:
var hello;
hello();//执行
hello = function(){
console.log(‘hello’);
}
在执行的时候hello是只被声明的,它的值是undefined,所以用()来调用会出现TypeError,改成下面这样才能正常工作,想用这种方式写,需要将其放到函数执行的前面:
var hello= function(){
console.log(‘hello’);
}
hello();//执行
函数优先
hello();//执行
var hello;
function hello(){
console.log(‘log hello’);
}
hello = function(){
console.log(‘log hello1’);
}
这段代码会打印出:log hello
从结果中可以看到函数执行的时候是打印了log hello,函数执行完以后hello变量会被赋值语句替换成打印log hello1的函数,为啥?实际这段代码会被处理成这样
function hello(){
console.log(‘log hello’);
}
hello();//执行
//var hello这句被忽略了
hello = function(){
console.log(‘log hello1’);
}
函数优先提升到最上面,此时在用声明var hello将被忽略,因为此时已经存在hello了,他是一个函数,那接下来执行函数hello当然就打印出之前的结果,然后才被替换。
最后
编程基础的初级开发者,计算机科学专业的学生,以及平时没怎么利用过数据结构与算法的开发人员希望复习这些概念为下次技术面试做准备。或者想学习一些计算机科学的基本概念,以优化代码,提高编程技能。这份笔记都是可以作为参考的。