一.定义和声明
1.对于变量来说,定义就是声明。
例如:int a ;
我们可以说它是定义也可以说是声明
2.对于函数来说,声明和定义完全不是一回事。
void sum(int a,int b); --函数的声明
void sum(int a,int b){ }; --函数的定义
二.重复声明同一个变量
var a = 1;var a = 2;console.log(a); // 2
var a = 1;var a;console.log(a); //1
从变量提升的角度去理解,上面的代码经过变量提升就可以改写成下面这样,因为变量提升只提升声明不提升赋值
var a;var a;a = 1;console.log(a);
参考《JavaScript高级程序设计》第7.3章节,原话如下
JavaScript从来不会告诉你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不见(不过,它会执行后续声明中的变量初始化)。
三.有俩个同名方法
function foo() { console.log('foo1');}foo(); // foo2function foo() { console.log('foo2');}foo(); // foo2
在js里同时有两个相同的函数方法时,在调用该方法时并不好报错,会默认调用最后一个同名方法(涉及到函数提升)
四.两个同名的函数表达式
var foo = function () { console.log('foo1');}foo(); // foo1var foo = function () { console.log('foo2');}foo(); // foo2
函数表达式则不会有提升(此处实质为变量提升)
五.变量提升和函数提升
1.变量提升
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。全局变量提升到全局作用域的最开始,函数中的局部变量则提升到函数的最开始。
(注意:函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!)
2.函数提升
js中创建函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升! 例子可对比上面第三点和第四点。
六.全局变量和局部变量重名
1.定义全局变量和局部变量,变量名都是age。在函数内部不对局部变量age赋值
var age = 250;//定义一个全局变量age,赋值为250function testf(){ console.log("testf:age="+age);//age是局部变量,因为有变量声明提升,所以age是undefined; var age;//定了一个局部变量age,没有赋值。}
2.定义全局变量和局部变量,变量名都是age。在函数内部对局部变量age赋值
var age = 250;//定义一个全局变量age,赋值为250function testf(){ console.log("testf:age="+age);//age是局部变量,因为有变量声明提升,所以age是undefined; var age=300;//定了一个局部变量age,并赋值为300。 console.log("testf:age="+age);//300}