javascript变量作用域

    <html>  
<head>
<script>
function f(){
a = 1; //全局变量a赋值为1
var b = 2; 局部变量b赋值为2
}
try{
alert(a);

}
catch(e){
alert(e.message); //变量a未定义
}
f();<span style="white-space: pre;"> </span>//调用函数
alert(a); //1
</script>
</head>
</html>

变量的赋值操作发生在javascript执行期,而不是预编译期,在函数未调用前,函数内部定义的全局变量是无效的。
    <html>  
<head>
<script>
var a = 1; //声明并初始化全局变量
(function f(){
alert(a); //undefined
var a = 2; //声明并初始化局部变量
alert(a); //2
})();
</script>
</head>
</html>

由于函数内部声明了一个同名局部变量a,所以在预编译期,javascript就是用该变量覆盖掉拳击变量对于函数内部的影响,而在执行初期,局部变量a未赋值,所以在第一行读取局部变量a的值也就是undefined了。
<html>  
<head>
<script>
var a = 1;
var b = 2;

function f(){
var a = 3;
function f(){
alert(a); //读取变量a的值,返回3
var b; //声明局部变量b
alert(b); //读取局部变量b的值,undefined
}
return f;
}
var c = f();
c();
</script>
</head>
</html>

在闭包函数中,变量的作用域并没有因为使用闭包而发生改变,同时函数与闭包之间的作用域链也没有因为闭包而破坏,
<html>  
<head>
<script>

var a = 1;
(function(){
var b = 2;
(function(){
var c = 3;
(function (){
var d = 4;
alert(a+b+c+d); //10
})()
})()
})()
</script>
</head>
</html>

javascript 解释器首先在最内层调用对象中查询属性a,b,c,d,其中只发现了属性d,并获取它的值,然后沿着作用域链,在上一层调用对象中继续查询查找属性a,b,c,以此类推。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值