zoukankan      html  css  js  c++  java
  • JavaScript作用域原理——作用域根据函数划分

    一、一个for实例

    <p id="scope3" style="color:red"></p>
    复制代码
         var pscope3 = document.getElementById('scope3');
            function scope3() {
                for(var i=0; i<10; i++){ 
                   
                }
                echo(pscope3,  i);
            }
            scope3();
    复制代码

    1、函数在java、C#等语言中,变量i只会在for循环语句中有定义,循环结束,i也就被销毁了。但在JavaScript中,变量i是定义在scope3()活动对象中的,因此在它定义开始,就可以在函数内部访问它。

    2、打印出的i为“10”。

    3、函数scope3等效于下面的代码:

    复制代码
         function scope3() {
                var i;
                for(i=0; i<10; i++){ 
                   
                }
                echo(pscope3,  i);
            }        
    复制代码

    二、私有作用域的匿名函数

    复制代码
         function anonymous() {
                var position = 'in anonymous';
                (function(){
                    for(var i=0; i<10; i++){ 
                   
                    }
                    echo(pscope3, position);//打印显示"in anonymous"
                })();
                //pscope3.innerHTML += i;//报错
            }
            anonymous();
    复制代码

    1、匿名函数可以用来模仿块级作用域,避免上面的那个问题。

    2、在for循环外部插入了一个私有作用域。在匿名函数中定义的任何变量,都会在执行结束时被销毁。

    3、上面的那句注释掉的话,取消注释的话,就会显示错误信息:“ReferenceError: i is not defined”。

    4、作用域的关系大致如下:

    5、position是定义在anonymous函数中的,但可以在匿名函数中打印出来,因为anonymous的作用域包住了匿名函数,在匿名函数中找不到position定义,就往外找。

    三、try语句catch部分的特殊情况

    复制代码
         function capture() {
                var ex = 'in capture';
                try{  
                    i;
                }catch(ex){
                    var position= 'in catch';
                    echo(pscope3, ex); //ReferenceError: i is not defined
                    var ex = 'is catching';
                    echo(pscope3, position);//in catch
                    echo(pscope3, ex);//is catching
                }
                echo(pscope3, position);//in catch
                echo(pscope3, ex); //in capture 不是catch中赋的值
                echo(pscope3, window.ex); //undefined
            }
            capture();
    复制代码

    1、catch的一个参数ex与capture函数下的局部变量ex同名。

    2、catch中先打印ex,是错误信息,然后赋值为“is catching”,打印出来,但很奇怪,catch外面打印的ex是“in capture”,并不是里面覆盖的值。

    3、position在catch中定义,但是可以在catch的外面打印出来。

    4、window.ex输出的是undefined,也就是说ex不是全局的,因此可以推出catch后面的大括号是普通语句块的性质。

    5、ex的性质可以视为唯一一个把catch语句块当做块作用域的变量,是catch语句块的局部变量。

  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/chenliyang/p/6554434.html
Copyright © 2011-2022 走看看