Javascript的块作用域和Java,C++的区别

首先开门见山,用一句话来概括,Javascript是没有块作用域的概念的,这是为什么呢,这听起来的确和其他的语言很不一样,上例子:

window.onload = function () {
    outputNumber(4);
};
function outputNumber(count){
    for(var i=0;i<count;i++){
        document.write(i+"<br>");
    }
    alert(i);
}

用一个最简单的例子,在outputNumber函数里面执行for循环计数,最后的输出结果应该是undefined的,但是实际上却输出了4,循环中的i变量并没有清掉。这是和Java等语言不同的地方,在这个函数里面,定义的任何变量都是可以一直引用的,当退出函数,引用才会释放。

那么,有没有方法来模拟一下块作用域呢,肯定是有的,这里要了解一下匿名函数的特点,它的作用域链是包含其存在的外函数的,所以能够调用到全局变量和外变量,但是调用结束,其内部变量就会销毁,这样就达到了模拟块作用域的效果,示例如下:

window.onload = function () {
    outputNumber(4);
};
function outputNumber(count){
    (function () {
        for (var i = 0; i < count; i++) {
            document.write(i + "<br>");
        }
    })();
    alert(i);//并没有值
}

这时候变量i就访问不到了。这个putputNumber里面是一个匿名函数,然后加上一个括号,最后再添加一个括号,表示立即运行,运行结束后就销毁运行环境了,这样在后面自然就访问不到i的值了。

使用这种方法(又叫私有作用域)还有一个好处,就是可以避免命名,这样在项目中有大量的变量存在时可以防止名字冲突。比如下面一个访问时间的例子:

(function (){
        var nowtime = new Date();
            document.write((Number(nowtime.getMonth())+1)+"月"+nowtime.getDate()+"日"+nowtime.getHours()+"时"+nowtime.getMinutes()+"分");
            document.write("<br>"+"星期"+nowtime.getDay());
        }
    )();

这个例子正确的显示了日期和星期。它是可以直接运行的。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值