Javascript中的var变量声明作用域问题

本文探讨了JavaScript中var关键字声明变量的特性,解释了为何在if语句中使用var会导致变量作用域扩展到整个函数,而不是仅限于块级作用域。通过示例代码展示了这种现象,并与Java的块级作用域进行了对比,强调了JavaScript中只有全局和局部作用域。最后,通过另一段代码进一步证明了变量作用域的限制仅存在于函数内部,不会影响到函数外部。

先看一下这两段代码的执行结果

var name2 = 'What!';
function a() {
    if (typeof name2 === 'undefined') {
        console.log('Undefined');
        var name2 = 'Jack';
    } else {
        console.log('Hello ' + name2);
    }
}
a();

将if语句中的var声明注释掉

var name2 = 'What!';
function a() {
    if (typeof name2 === 'undefined') {
        console.log('Undefined');
        //var name2 = 'Jack';
    } else {
        console.log('Hello ' + name2);
    }
}
a();

前一个会输出Undefined, 后一个会输出Hello What!. 说明在if里的var变量声明, 会影响到外部.
再运行一个代码

function f1(){
  if (typeof name3 === 'undefined') {
  	console.log("undefined");
  	var name3 = "anything";
  }
  if (typeof name3 !== 'undefined') {
    console.log("defined!");
  }
}
f1();
if (typeof name3 === 'undefined') {
  console.log("undefined outside");
}

这段代码会输出

undefined
defined!
undefined outside

说明这个影响的范围仅在于函数内部, 不会影响到函数外

说明
JavaScript的变量声明没有块级作用域, 例如在Java中, 可以这样声明b, 这个b的作用域仅在于if内部

if (a == null) {
  String b = "c";
}

在JavaScript中, 只有两种作用域: 全局和局部, 在函数内任意语句中使用var声明的变量, 不管所在的语句块实际是否会执行, 都等价于在函数开头声明, 前面的代码等价于

var name2 = 'What!';
function a() {
    var name2;
    if (typeof name2 === 'undefined') {
        console.log('Undefined');
        name2 = 'Jack';
    } else {
        console.log('Hello ' + name2);
    }
}
a();

这样产生的输出就容易理解了.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值