javascript中的变量作用域

在网上看了一道js面试题

<script type="text/javascript">

var tt = 'aa';
function test() {
	alert(tt);
	var tt = 'bb';
	alert (tt);

}
test();
</script>


运行结果: 第一个alert(tt)弹出的是undefined 第二个弹出的是 'bb'

why:

权威指南说:Javascript中的函数“在定义它们的作用域里运行,而不是在执行它们的作用域里运行”

函数在调用的时候都会产生一个独立的作用域对象,也就是运行时上下文,这个域对象包括了两部分,第一部分是函数自身声明的对象,另一部分是js对象自身的属性,在函数执行过程中当遇到一个变量的时候,查找的顺序也是从前端向后深入查找,当查找不到的时候就返回'undefined'。


而外面定义的'aa'在第一次alert()的时候为什么没有找到?

调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量)、函数参数及Arguments对象都在函数内的作用域中——这意味着它们隐藏了作用域链更上层的任何同名的属性。也就是说,在程序中,test函数内部的“var tt='bb'”将会致使“var tt='aa'”在test函数被调用时完全被隐藏。

在定义test函数时,当定义第一个alert(tt)时,这里会记录tt是作用域链中的一个变量但不会记录tt的值,函数定义完毕后tt就添加到作用域里,所以第一个alert语句能够找到该作用域里的tt,但没有值,所以第一次会弹出 'undefined'.


原文地址:https://www.cnblogs.com/fuhaots2009/p/3465098.html