先说几个概念:

   1、js代码从上往下执行 

   2、变量提升:

     变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域叫window,window分两个模块,一个叫内存模块,一个叫运行模块,内存模块找到当前作用域下的所有带var和function的关键字,执行模块执行js代码,从上到下执行,遇到变量就会通过内存地址去查找这个变量,有和没有这个变量。有这个变量就会看赋值没赋值,如果赋值就是后面的值,如果没有赋值就是undefined,如果没有找到就说这个变量 is not defined。

   3、作用域链:

      当函数内部的变量被使用时,首先会在自己的私有作用域下查找是否有这个变量,如果有就使用,如果没有就会向上一级(父级)查找,父级有就使用父级的,如果没有就继续向上一级找,有就使用,没有就接着往上找,直到window,window有就用,没有就是is not defined。我们管这种查找机制叫做作用域链。

一、简单的小案例:

    1、

      var a = 12;

    function fn(){

      console.log(a);  //undefined

      var a = 45;

      console.log(a);  //45

    }

     2、

      function fn(){

      console.log(11);

      function ff(){

        console.log(22);

      }

      ff();

    }

    fn()  //11

    ff()  // ff is not defined

     3、

       var   a = 123;
    function  fun(){
     alert(a)  //123
    }
    fun();      //私有作用域下没有声明变量a,就在父级找,有就直接使用。

     4、

       var   a = 123;
    function   fun(){
      alert(a);  //123    私有作用域里并没有声明变量a,所以就在父级找,有就直接使用。
      a = 456;
     }
     fun()
     alert(a)  //456      fun()里改变了全局变量a的值

     5、

       var   a = 123;
    function   fun(a){
      alert(a);  //undefined    这里有形参,但是并没有传实参 
      a = 456;    //给参数赋值
    }
    fun();
    alert(a)  //123    全局变量a

     6、

       var   a = 123;
       function    fun(a){
        alert(a);  //123      这里传了固定的参数123
        a = 456;
       }
       fun(123)
       alert(a)  //123

     7、

       var   a = 12;
    function   fn(){
      console.log(a)  //undefined      代码从上往下执行,内存模块只定义,不赋值。
      var   a = 45;
       console . log(a)  //45
    }
    fn()

     8、

       function test(a,b){
         console . log(b)  //function b(){}       function关键字,在内存模块里面声明和定义同时进行
         console . log(a)  //1   
         c=0;
         a=3;
         b=2;
         console . log(b);    //2
         function   b(){ }
         function   d(){ }
         console . log(b)    //2
       }
       test(1)

     9、

       function   test(a,b){
         console . log(a)  //function  a(){}  覆盖了实参
         console . log(b)  //undefined
         var   b=234;
         console . log(b)  //234
         a=123;
         console . log(a)  //123
         function   a(){ }
         var   a;
         b=234;
         var   b=function (){ }
         console . log(a);  //123
         console . log(b) //function
       }
       test(1)

       

二、阿里面试:

    var a = 100;

    function testResult(){

      var b = 2 * a;

      var a = 200;

      var c = a / 2;

      alert(b);

      alert(c);

    }

    

三、自调用函数:

    +function(){

      console.log(a);

      var a = 5;

      function a(){}

      console.log(a);

      function b(){}

      b = 6;

      console.log(b);

      var c = d = b;

    }()

    console.log(d);

    console.log(c);

注:自调用函数没有变量提升!

js:作用域总结1的更多相关文章

  1. JS作用域面试题总结

    关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量) ...

  2. js作用域问题

    <script type="text/javascript"> alert(i);//Uncaught ReferenceError: i is not defined ...

  3. js 作用域

    js 作用域 js作用域链查找,子函数能取到父函数中定义的变量. 前段时间误写成如下形式: 这只是普通的函数调用,没有父子的关系,child()函数会在全局查找pi变量,没找到所以报错. 最近发现原来 ...

  4. 08.01 签到! js 作用域

    js 作用域 : 1.js 没有块作用域 : for (var i = 0;i < 4; i++){ } alert(i) // i = 3 2.js 没有动态作用域: function f1( ...

  5. js作用域链

    js作用域链 <script> var up = 555; function display(){ var innerVar = 2; function inner(){ var inne ...

  6. easyui datagrid load 封装 参数问题 js 作用域

    var temp = { LoginAccount: $('#LoginAccount').val(), ShopName: $('#ShopName').val() }; function doSe ...

  7. js作用域零碎的知识点,不同的script块,虽然同是全局变量

    如下代码,第一次弹出a,因为解析器里找到var a,赋予a变量undefined,弹出undefined <!DOCTYPE html> <html> <head> ...

  8. JS作用域,作用域,作用链详解

    前言   通过本文,你大概明白作用域,作用域链是什么,毕竟这也算JS中的基本概念. 一.作用域(scope) 什么是作用域,你可以理解为你所声明变量的可用范围,我在某个范围内申明了一个变量,且这个变量 ...

  9. JS作用域和ASP(vbs)作用域比较

    一.js作用域,先上图: 以上代码执行的效果是,依次弹出 undefined, undefined, a, a,为什么是这样的结果啦?因为JS的作用域为链式作用域. 作用域链: 用VAR声明一个变量时 ...

  10. js作用域对象与运用技巧

    1. JS作用域 1.1 全局作用域和局部作用域 函数外面声明的就是 全局作用域 函数内是局部作用域 全局变量可以直接在函数内修改和使用 变量,使用var是声明,没有var是使用变量. 如果在函数内使 ...

随机推荐

  1. CentOS上升级gcc编译器使支持C++11

    首先向博主致敬,好的东西拿来共享了,用一下不错. https://blog.csdn.net/clirus/article/details/62424517 0. 目标  最近在学习c++11,我本机 ...

  2. 由一次报错引发的对于Spring创建对象的理解

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ent ...

  3. JDBC driver连接MySQL运行报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than

    出错原因: 因为安装mysql的时候时区设置的不正确. mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用GMT+8:00格式. 也就是说是数据库和系统时区差异所造成的. 验证:运行c ...

  4. docker下运行labview2010

    前言 本人笔记本用kali,因课程需要,要在Linux下运行Labview,找到了2010的iso,但只支持rehat系列的发行版,用rpm转化deb的方案不可行,尝试了在virtualbox下运行w ...

  5. cocos2dx为Sprite添加触摸事件监听器

    1.首先头文件定义事件处理的函数原型 private: bool onTouchBegan(Touch* tTouch,Event* eEvent);//手指按下事件 void onTouchMove ...

  6. this指向问题 --无return

    this的指向在函数定义的时候是确定不了的只有在函数执行的时候才能确定this到底指向谁.this指向上一级对象 1.函数调用,this指向window var color = "red&q ...

  7. zabbix的自动发现、自定义添加监控项目、配置邮件告警

    1.zabbix的自动发现这里的自动发现,所显示出来的是规则的上自动了现 然后 可以对其内容进行相关的配制,如时间或周期 注意:对于单个主机的规则,可以自行添加或删除, 但对于已经添加好了的规则,若需 ...

  8. https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名

    声明:本文章已授权公众号Hollis转载,如需转载请标明转载自https://www.cnblogs.com/wutianqi/p/10654245.html(安静的boy) 一.为什么要使用http ...

  9. Cronolog切割tomcat日志

    Cronolog切割tomcat 安装cronolog 1. 将cronolog-1.6.2.tar.gz 上传至/opt 目录 2. 解压缩 #解压缩 tar -zxvf cronolog-1.6. ...

  10. zombodb  query dsl

    zombodb query dsl 是为了简化es 查询的处理,同时可以兼容基本上所有的es 操作 一个简单的查询,查询任何字段包含cats 以及dogs 的 SELECT * FROM table ...