先说几个概念:

   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. 关于dos命令行脚本编写

    dos常用命令另查 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码也是共用的,只是cmd文件中允许 ...

  2. 算法复杂度中的O(logN)底数是多少

    前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多少.算法中log级别的时间复杂度都是由于使用了分治思想,这 ...

  3. 本地代码上传到githup

    1.githup网站创建new repository 2.执行下面命令,找到本地用户公钥地址 ssh -v git@github.com 输出: debug1: Offering RSA public ...

  4. 文本对齐方式(text-align)

    text-align 设置元素内文本的水平对齐方式. 属性值:left.right.center.justify 注:该属性对块级元素设置有效.

  5. Ubuntu16.04中pip无法更新升级,采用源码方式安装

    1.从pip官网下载最新版 https://pypi.org/project/pip/#files 2.ubuntu中创建文件位置,我的放在一下路径,之后进行解压 3.解压后进入pip的文件夹,在执行 ...

  6. #考研笔记#计算机之word问题

    Word 问题:1. 如何为文档加密保存?单击 office 按钮\另存为\工具按钮\常规选项\设置打开文件时的密码 2. 怎样在横格稿纸中录入古诗?单击 office 按钮\新建\模板\信纸\稿纸( ...

  7. Kali安装虚拟机遇到的问题

    1.上官网下载了最新版的VMware 14.0版,安装的时候下一步下一步就是了. 2.最新版的官网激活码 FF590-2DX83-M81LZ-XDM7E-MKUT4 CG54H-D8D0H-H8DHY ...

  8. 回顾HashMap

    一.HashMap的原理简述 HashMap是基于哈希表的非线程安全的Map实现,内部采用数组+链表实现,其内部类Node定义了数据元素类型,它扩展了Map.Entry<K,V>增加了指向 ...

  9. redis 5.0.3 讲解、集群搭建

    REDIS 一 .redis 介绍 不管你是从事Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业务代码的程序员,实际工作中或许只用到了 ...

  10. babelrc 中的 presets 字段(env, react)和 plugins 字段(dynamic-import-webpack, transform-object-rest-spread, ...)

    一.presets 字段 目前用到 presets: [ 'env', 'react'   // react 转码规则 ]: 只有 env 时,作用和 latest 相同,包括 es5.es6.es7 ...