变量提升和函数提升,创建同名变量,同名函数,同名表达式的情况,全局变量和局部变量重名

一.定义和声明

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();  // foo2
function foo() {
    console.log('foo2');
}
foo(); // foo2

      在js里同时有两个相同的函数方法时,在调用该方法时并不好报错,会默认调用最后一个同名方法(涉及到函数提升)

四.两个同名的函数表达式

var foo = function () {
    console.log('foo1');
}
foo();  // foo1
var foo = function () {
    console.log('foo2');
}
foo(); // foo2
  函数表达式则不会有提升(此处实质为变量提升)

五.变量提升和函数提升

1.变量提升

       在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。全局变量提升到全局作用域的最开始,函数中的局部变量则提升到函数的最开始。

     (注意:函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!)

2.函数提升

       js中创建函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升!  例子可对比上面第三点和第四点。

六.全局变量和局部变量重名

 1.定义全局变量和局部变量,变量名都是age。在函数内部不对局部变量age赋值

var age = 250;//定义一个全局变量age,赋值为250
function testf(){
    console.log("testf:age="+age);//age是局部变量,因为有变量声明提升,所以age是undefined;
    var age;//定了一个局部变量age,没有赋值。
}

2.定义全局变量和局部变量,变量名都是age。在函数内部对局部变量age赋值

var age = 250;//定义一个全局变量age,赋值为250
function testf(){
    console.log("testf:age="+age);//age是局部变量,因为有变量声明提升,所以age是undefined;
    var age=300;//定了一个局部变量age,并赋值为300。
    console.log("testf:age="+age);//300
}

 

posted @ 2018-12-28 18:57  windalm  阅读(735)  评论(1编辑  收藏  举报