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

浙公网安备 33010602011771号