js函数作用域及变量提升

前言

一直以来我对js有个特别不明白的地方,那就是作用域,因为以前学过c,一直没搞清两个之间的差别,今天就仔细谈一谈js作用域的问题。

JavaScript作用域

var a = 1;  
console.log(a); // 1  
if (true) {  
    var a = 2;  
    console.log(a); // 2  
}  
console.log(a); // 2  

以上代码如果用c语言执行的话输出结果会是1、2、1,因为if会创建新的作用域,但js不会。

js会在函数里创建作用域。

1.全局作用域

  创建全局作用域有几种方式:

    (1)最外层函数和在最外层函数外面定义的变量拥有全局作用域

        

var a="test";
function foo(){
    var b="demo";
    function foo1(){
        alert(b);
    }
    foo1();
}
alert(a); //test
alert(b); //  error
foo(); //demo
foo1() //error

     (2)所有末定义直接赋值的变量自动声明为拥有全局作用域(这个比较简单就不举例了)

     (3)window对象的属性拥有全局作用域

2.局部作用域

  局部作用域就是函数内部的作用域哈

那么现在问题来了,解释这么多有什么用喃?

了解这些之后,我们就可以来了解一个有意思的东西了。。。。。

 

变量提升及代码优化

要彻底理解JS的作用域和Hoisting,只要记住以下三点即可:

      1、所有申明都会被提升到作用域的最顶上

      2、同一个变量申明只进行一次,并且因此其他申明都会被忽略

      3、函数声明的优先级优于变量申明,且函数声明会连带定义一起被提升

 

posted @ 2017-06-16 16:32  糊涂一点web  阅读(167)  评论(0)    收藏  举报