在js中变量的有效范围问题

本文详细探讨了JavaScript中变量的特性与使用规范,包括不同情况下变量的定义与使用、重复定义变量的效果、方法内外变量的访问规则以及JavaScript中不存在块级作用域的特点。

JavaScript中变量的作用

文中有不对的地方请大家谅解和提出,谢谢!

1.在方法中定义一个变量的时候不用var的情况

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta charset="GB2312"/>
<title>在方法中定义一个变量的时候不用var的情况</title>


<script type="text/javascript">

function f1(){
x=100;
alert('方法内X:'+x);
}
alert('方法外X--:'+x);//这行代码是错的,因为f1方法调用在它后面,就相当与没有定义x,直接使用
//********************************************************************************************************************//
f1(); //在这行代码之前(不包括方法内)使用变量x都是错误的。*号以上除了f1方法中,其他地方使用x都是错误的
//********************************************************************************************************************//
alert('方法外X:'+x);//这行代码正确打印出100

</script>
</head>


<body>
</body>

</html>

为了阅读起来比较舒服,下面我只留js代码

2.在js的重复定义一个变量的时候,会自动忽略第二次定义,但是不忽略赋值

<script type="text/javascript">
var n=10;
alert(n);//正确打印10
var n=1234;
alert(n);//正确打印1234
</script>

3.方法内部变量,外部将无法访问。

<script type="text/javascript">
function f1(){
var n=10;
n++;
alert(n);//
正确打印出11
}
f1();
//调用f1();函数

alert(n);
//
这句话是错误的,以前浏览器还会提示报错,由于版本升级等等原因,现在的浏览器都不报错了,只是什么都不显示,要想查看:工具-->开发人员工具,进行调试查看错误。//这句话错误的原因是,js中定义:方法内定义的变量,方法外无法访问。而这行代码访问了f1函数中的变量n。

</script>

4.js中没有块级定义域(if、for、while等)

<script type="text/javascript">

function f1(){
var x=10;
if(x>5){
var n=10
n++;
alert(n); //正确打印出来11,
}
n++;
alert(n);
//正确打印出12,只要是学了C、C#、java等,都觉得在这里调用if语句里面的变量n会报错,实际上在js中这是正确的。
//因为js语法规定:js中没有块级定义域(if、for、while等),所以在方法内部定义的变量,在方法'任何地方'(定义变量下面的代码都能正常访问)都有效。
//for循环while等语句都是一个道理。


}
f1(); //调用f1();函数

</script>

### JavaScript 中 `var` 变量的作用域范围 在 JavaScript 中,`var` 声明的变量具有函数作用域或全局作用域。如果变量是在函数内部通过 `var` 声明的,则该变量仅在函数内部有效[^1]。如果变量是在函数外部声明的,则该变量为全局变量,在整个脚本中都可以访问[^2]。 #### 1. 函数作用域 当使用 `var` 在函数内部声明一个变量时,该变量仅在函数内部可见。例如: ```javascript function example() { var localVar = "I am local"; console.log(localVar); // 输出 "I am local" } console.log(localVar); // 抛出 ReferenceError: localVar is not defined ``` 上述代码中,`localVar` 是在 `example` 函数内部声明的变量,因此它只能在函数内部访问[^1]。 #### 2. 全局作用域 如果变量是在任何函数外部通过 `var` 声明的,则它是全局变量,并在整个脚本中都可访问。例如: ```javascript var globalVar = "I am global"; function checkGlobal() { console.log(globalVar); // 输出 "I am global" } checkGlobal(); console.log(globalVar); // 输出 "I am global" ``` 此处,`globalVar` 是全局变量,无论是在函数内部还是外部都可以访问[^2]。 #### 3. 变量提升 需要注意的是,`var` 声明的变量会被“提升”到其作用域的顶部,但其赋值不会被提升。例如: ```javascript function foo() { console.log(x); // 输出 undefined var x = 'Hello, World'; console.log(x); // 输出 "Hello, World" } foo(); ``` 在这个例子中,`x` 被提升到了函数作用域的顶部,但在赋值之前访问它会导致输出 `undefined`[^1]。 #### 4. 内部函数与作用域屏蔽 如果在内部函数中声明了一个与外部函数同名的变量,则内部函数中的变量会屏蔽掉外部函数中的变量。例如: ```javascript function outer() { var name = "Outer"; function inner() { var name = "Inner"; console.log(name); // 输出 "Inner" } inner(); console.log(name); // 输出 "Outer" } outer(); ``` 这里,`inner` 函数中的 `name` 屏蔽了 `outer` 函数中的 `name`,导致每次调用时输出不同的值。 #### 5. 闭包中的作用域 在闭包中,`var` 声明的变量可以在外部函数返回后仍然保持引用。例如: ```javascript function createClosure() { var message = "Hello, World"; return function() { console.log(message); }; } var closure = createClosure(); closure(); // 输出 "Hello, World" ``` 即使 `createClosure` 函数已经执行完毕,`message` 变量仍然可以通过闭包访问[^3]。 ### 总结 `var` 声明的变量具有函数作用域或全局作用域。在函数内部声明的变量仅在函数内部可见,而在函数外部声明的变量是全局变量。此外,`var` 声明的变量会被提升到其作用域的顶部,可能导致意外的行为。内部函数中的变量可以屏蔽外部函数中的同名变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值