看下面这段代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js</title>
</head>
<body>
<button id="button-1">first</button>
<button id="button-2">second</button>
<button id="button-3">third</button><button id="button2-1">2first</button>
<button id="button2-2">2second</button>
<button id="button2-3">2third</button><script type="text/javascript">
for (var i = 1; i < 4; i++) {
document.getElementById('button-' + i).onclick=function(local_i){
return function(){
alert(local_i);
};
}(i);
}for (var i = 1; i < 4; i++) {
document.getElementById('button2-' + i).onclick=function(){
alert(i);
};
}
</script>
</body>
</html>
点击first、second、three按钮分别输出几呢?点击2first、2second、2three按钮又分别输出几呢?你能说出结果吗?你能解释为何会有此结果吗?
JS和PHP不同,在JS中,一个函数在函数内部可以直接访问到函数外部的变量(PHP中不行,不过可以用5.3引入的闭包或是global关键字实现),简单说这就是所谓的作用域链。另外如果在函数A内部定义一个全局函数B,那么函数A调用完成,B仍然对A函数作用域保留有一份引用,也就是说这时候调用B函数,仍然可以访问到A函数作用域内的变量。注意是保留的是引用,不是值。
明白上面的知识,应该可以回答并解释出文章开头的问题了~~~
已经有(0)位网友发表了评论,你也评一评吧!
原创文章如转载,请注明:转载自Eddy Blog
原文地址:http://www.rrgod.com/technique/890.html 欢迎订阅Eddy Blog。
Tags:javascript 作用域链