1.JS解析步骤:

  a.预解析

    将变量声明提升;

    将函数声明及函数内容提升,可以理解成原来位置的函数在解析代码时已经提到代码初始位置;

    遇到重名,只留下一个;

    如有重名变量和函数,留下函数;

    如有两个重名函数,后一个函数覆盖前一个函数;

    firefox不能预解析块内定义的函数,出于兼容性考虑,定义函数,一般要放到最外面

    (注意:变量提升的是声明,函数提升的是声明和内容)

  b.逐行解析代码

    遇到表达式,可以修改预解析的变量值,例如变量赋值可以将函数声明替换掉;

2.如果有几个script代码部分,JS会按照先后顺序逐个解析执行,但是这几个代码部分共用一个域

3.函数的参数相当于在函数内部定义了这个变量,相当于局部变量

4.JS中,每个函数都有自己的执行环境(作用域),其中使用的变量会按照作用域链进行搜索,一直到全局环境,并且只会对目标变量所处的环境造成影响

5.被花括号包围的代码块在很多类c语言中会有块级作用域,JS没有块级作用域

6.函数传参相当于赋值表达式

7.只要是一个执行环境(作用域),就会发生JS解析两个步骤

  例子:

    alert(a); // function a (){ alert(4); }

    var a = 1;

    alert(a); // 1

    function a (){ alert(2);

    alert(a); // 1

    var a = 3;

    alert(a); // 3

    function a (){ alert(4); }

    alert(a); // 3    

    alert( typeof a );

    a(); // 报错

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    <script>

      alert(a);        //报错

    </script>

      <script>

      var a=1;

    </script>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    <script>

      var a=1       

    </script>

      <script>

      alert(a);   //1

    </script>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    var a = 1;
    function fn1(){
    alert(a); // undefined
    var a = 2;
    }
    fn1();
    alert(a); // 1

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    var a = 1;
    function fn1(){
     alert(a); // 1
    a = 2;
    }
    fn1();
    alert(a); // 2

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    var a = 1;
    function fn1(a){
    alert(a); // undefined
    a = 2;
    }
    fn1();
    alert(a); // 1

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    var a = 1;
    function fn1(a){
    alert(a); // 1
    a = 2;
    }
    fn1(a);
    alert(a); // 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    window.onload = function (){
    var aBtn = document.getElementsByTagName('input');

    for( var i=0; i<aBtn.length; i++ ){
    aBtn[i].onclick = function (){

    // alert( i ); // Undefined

    for( var i=0; i<aBtn.length; i++ ){
    aBtn[i].style.background = 'yellow';
    }

    };
    }
    };

 

JS作用域理解的更多相关文章

  1. JS作用域理解(声明提升)

    1.JS解析步骤: a.预解析 将变量声明提升: 将函数声明及函数内容提升,可以理解成原来位置的函数在解析代码时已经提到代码初始位置: 块内的变量声明和函数声明也会被提升,例如if语句 遇到重名,只留 ...

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

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

  3. js面向对象理解

    js面向对象理解 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...

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

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

  5. JS作用域面试题总结

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

  6. js作用域问题

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

  7. js 作用域

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

  8. 08.01 签到! js 作用域

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

  9. js作用域链

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

随机推荐

  1. python流程控制:for循环

    for循环: 先来看一个猜年龄的小程序: AGE = 23 count = 0 for i in range(10): if count == 3: u_count = input("y|n ...

  2. PHP获取当前类名、函数名、方法名

    PHP获取当前类名.方法名  __CLASS__ 获取当前类名  __FUNCTION__ 当前函数名(confirm)  __METHOD__ 当前方法名 (bankcard::confirm) _ ...

  3. 利用Selenium和Browsermob批量嗅探下载Bilibili网站视频

    Rerence: http://www.liuhao.me/2016/09/20/selenium_browsermob_sniff_bilibili_video/ 日常生活中,用电脑看视频是非常频繁 ...

  4. Python关键字yield的解释

    yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器. >>> def createGenerator() : ... mylist = range(3) . ...

  5. DevExpress控件学习总结2(转)

    1.TextEditor(barEditItem)取文本string editValue = barEditItem1.EditValue.ToString(); //错误,返回null string ...

  6. iOS 设置控件圆角、文字、字体

    以按钮为例: UIButton btn = [UIButton new]; btn.layer.masksToBounds = YES; btn.layer.cornerRadius = 10.0; ...

  7. YII 1.0 验证码

    public function actions(){ return array ( ‘captcha’=> array( ‘class’=> ‘CCatpchaAction’, ‘heig ...

  8. 在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)

    用VS2005+SQLSERVER2008开发C/S的程序,程序上线运行一段时间之后发现在某些功能偶尔出现如下的错误: 在向服务器发送请求时发生传输级错误. (provider: TCP 提供程序, ...

  9. 列表视图(ListView)和ListActivity

    ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项. 创建ListView有如下两种方式: 直接使用ListView进行创建. 让Activity继承ListActi ...

  10. spring mvc 资源包的映射

    在springmvc.xml中进行设置: <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...