JS 作用域

1.代码分析

<body>
    <div id="i1">
        <input type="button" value="btn1">
        <input type="button" value="btn2">
        <input type="button" value="btn3">
    </div>
    <script>
        //   终端输出都都是10
        for(var i =0 ;i<10;i++){
            setInterval(function () {
                console.log(i);
            },1000);
        }
        // 点击后,弹出的对话框都是3
        var i1_children = document.getElementById('i1').children;
        for(var i=0;i<i1_children.length;i++){
            var current_input = i1_children[i];
            current_input.onclick = function () {
                alert(i);
            }
        }
    </script>
</body>

  for循环完毕后,i已经变成了最后一个值,接着执行输出函数,结果都是最后的i

2.作用域链

    <script>
        var a = 123;
        function f1() {
            var a = 456;
            return f2;
        }
        function f2() {
            console.log(a);
        }
        f1()();
    </script>   结果是:123

会形成两条作用域链:

var a =123 -> f1: var a = 456

var a =123 -> f2: 

当执行f2函数时 会从第二条链去寻找。

3.匿名函数与自执行函数

        for(var i = 0;i<10;i++){
            setInterval(function () {
                console.log(i); //输出都是10
            },1000)
        }
        for(var i = 0;i<10;i++){
            setInterval((function () {
                console.log(i); //输出 0-9
            })(),1000)
        }

匿名函数没有立即调用执行,自执行函数立即调用执行。

4.Python作用域与JS一样

a = 123
def f1():
    a = 456
    return f2
def f2():
    print(a)

f1()()  #123

li = [lambda :i for i in range(10)]
print(li[0]()) #9

li = []
for i in range(10):
    def f1():
        print(i)
    li.append(f1)
li[0]() #9

 

posted @ 2017-05-21 23:34  1916  阅读(104)  评论(0)    收藏  举报