浅谈javascript的作用域

首先,看看下面的代码会输出什么?

例子一:

<script type="text/javascript">
var age = "22";
var name= "wusuopubupt";
function echo() {
	alert(name);
	var name = "czxttkl";
	alert(name);
	alert(age);
}
echo(name);
</script>

开始,我认为结果是:

wusuopubupt
czxttkl
23

可是实际输出却是:

undifined
czxttkl
23

为什么呢?

《javascript权威指南》上说:

1.在函数体内部,局部变量的优先级比同名的全局变量高。如果给一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,那么就有效的隐藏了这个全局变量。

2.JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.

3.函数体内部声明变量foo不用var标识符时,那么foo就是全局变量。


再看一个例子:

例子二:

<script type="text/javascript">
var age = "22";
var name= "wusuopubupt";
function echo() {
	alert(name);
	name = "czxttkl"; //注意这里没有了var!
	alert(name); 
	alert(age);
}
echo(name);
</script>

输出什么呢?

wusuopubupt
czxttkl
22
这是我们想要的结果!


为什么呢?

--因为javascript脚本执行会首先进行预编译!(参考:http://www.laruence.com/2009/05/28/863.html


原理与解释:

对于例子1:

因为在函数体内重新定义了局部变量var name="czxttkl",函数执行到第一个alert(name)时,外面的全局变量被局部变量覆盖掉,此时,局部变量name还没被定义(因为它的定义在第一个alert(name)的下面!),而javascript的预编译过程又告诉编译器存在name这么个变量,注意这里的name有值,只是它的值未定义(undefined),这就很好的解释了例一中的undefined的由来了。

为了说明undifined与error的区别,看下面这个例子:

<script type="text/javascript">
var name= "wusuopubupt";
function echo() {
	alert(age);
}
echo();
</script>

没有任何输出,查看chrome的log:

可以看到age的值不是未定义(undefined),而是报错:age is not defined(age 这个变量根本就不存在!)。现在可以证明例一中的第一个name是存在的,只是name的值是undifined而已。


对于例子2:

很简单,由于在函数体内部声明变量name = "czxttkl"时,并没有用到var这个标识符,所以name是个全局变量,所以第一次alert(name)时,输出的是全局变量(函数体外部生命的 var name="wusuopubupt").


参考:

1.《Javascript:The Definitive Guide》

2. laruence大牛:http://www.laruence.com/2009/05/28/863.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript 作用域指的是变量、函数和对象可以被访问的范围。在 JavaScript 中,作用域分为全局作用域和局部作用域两种。 全局作用域指的是在函数外定义的变量和函数,它们可以被整个程序访问。在浏览器中,全局作用域指的是 window 对象。 局部作用域指的是在函数内部定义的变量和函数,它们只能在函数内部被访问。在 JavaScript 中,每当一个函数被调用时,都会创建一个新的局部作用域JavaScript 使用词法作用域(也称为静态作用域)规则来决定变量的作用域。这意味着函数的作用域是在函数定义时确定的,而不是在函数调用时确定的。因此,在函数内部定义的变量可以在函数外部访问,但函数外部定义的变量不能在函数内部访问。 例如,下面的代码演示了 JavaScript 中的作用域: ``` var x = 10; // 全局变量 function foo() { var y = 20; // 局部变量 console.log(x); // 可以访问全局变量 x console.log(y); // 可以访问局部变量 y } foo(); console.log(x); // 可以访问全局变量 x console.log(y); // 不能访问局部变量 y ``` 在上面的例子中,变量 x 是在全局作用域中定义的,可以在函数内部和外部访问。变量 y 是在函数内部定义的,只能在函数内部访问。函数 `foo()` 调用后,可以在函数内部访问变量 x 和 y。函数调用结束后,只能在全局作用域中访问变量 x,无法访问变量 y。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值