javascript的作用域相关整理

javascript作用域相关整理。

 

在js中,var声明的变量,如果在方法中声明,那么就是局部变量,如果在全局声明则是全局变量。

如果变量没有通过var声明,直接赋值,则自动默认为全局变量。

ps:方法块中才是局部变量范围,具体指函数的{ }内,循环、判断并不是作用域的判断标准。

在js执行之前,js会自动分析所有代码的声明部分,判断各个变量的声明。具体看例二和例三。

 

一、全局作用域(全局作用域就是在整个代码中都能访问的对象)

第一种全局作用域是最外面定义的变量

var toDay = "Tuesday";
function func() {
    var yesterday = "Monday";
    function func2() {
        console.log(yesterday);
    }
    func2()
}
alert(toDay);
{#提示Tuesday#}
alert(yesterday);
{#报错#}
func();
{#打印Monday#}
func2();
{#报错#}

1,最外面声明的变量,方法内都可以调用。

2,外面函数声明的变量,里面的函数可以调用。

3,外面不能调用函数里面声明的变量。

4,外面不能调用函数里面的函数。

 

第二种是不写var的变量

function func() {
    toDay = "Tuesday";
    var yesterday = "Monday";
    alert(toDay)
}
func();
{#执行函数,提示Tuesday#}
alert(toDay);
{#提示Tuesday#}
alert(yesterday);
{#报错#}

没有定义,直接赋值,自动声明为全局变量。

 

还有一种,所有window对象的属性拥有全局作用域。

一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。\

 

 ps:什么是window对象

window对象
所有浏览器都支持 window 对象。
概念上讲.一个html文档对应一个window对象.
功能上讲: 控制浏览器窗口的.
使用上讲: window对象不需要创建对象,直接使用即可


alert() 显示带有一段消息和一个确认按钮的警告框。
confirm() 显示带有一段消息以及确认按钮和取消按钮的对话框。
prompt() 显示可提示用户输入的对话框。

open() 打开一个新的浏览器窗口或查找一个已命名的窗口。
close() 关闭浏览器窗口。

setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。
clearInterval() 取消由 setInterval() 设置的 timeout。
setTimeout() 在指定的毫秒数后调用函数或计算表达式。
clearTimeout() 取消由 setTimeout() 方法设置的 timeout。
scrollTo() 把内容滚动到指定的坐标。

 

 

 

二、局部变量(在函数内部,当局部变量与全局变量重名时,局部变量优先级高于全局变量,但不会在内存区域中覆盖全局变量:)

简单说就是,局部变量在局部范围内会覆盖全局变量,但离开局部变量范围,会变回全局变量。

 例一

1 <script type="text/javascript">  
2  var a = "Hello";  
3  function test(){  
4       var a;  
5       alert(a);  //未定义,因为方法内的声明没有赋值
6       a = "World";  
7       alert(a);  //World
8  }  
9 </script>

执行结果是未定义和world

 例一中,由于在函数中声明了a,所以这个a是局部变量,然而没有赋值,直接alert,所以结果会报未定义。

例二

 1 <script>
 2  var a = "Hello";
 3   function test(){
 4        alert(a); //Hello
 5        a = "World";
 6        alert(a); //World
 7                 }
 8      test();
 9      alert(a) //Hello
10  </script>

执行结果为Hello World

在方法test中,首先alert(a); 由于a在方法块中也没有var声明,所以直接找外面的全局变量a="Hello".

后面由于在次全局变量赋值为world,所以第二次alert就变成了world,需要注意的是,此时,外面的全局变量已经被覆盖为world了。

所以即便在方法外面执行alert也是world。

例三

 1 <script>
 2     var a =1;
 3     function test(){
 4         alert(a); //未定义
 5         a=4;
 6         alert(a); //4
 7         var a;   
 8         alert(a); //4,上面第五行已经赋值了
 9     }
10     test();
11     alert(a); //1
12 </script>

例三需要注意的是,js程序执行前会先找到所有声明的变量,test方法中,第一个alert(第四行),

这里js程序执行前不会去找方法外面声明的a=1,而是先找方法块内{ } var声明的a,但是此时a还没有被赋值,所以结果是未定义,所以如果此时将函数内的var a删掉,

第四行的代码就会去找方法外面声明的var a=1了。

在最后,alert(a),这次还是找到的第二行的var a=1,因为test方法内的局部变量只能影响在test函数内,并不能影响全局范围。

 

 

总结:

JavaScript通过函数管理作用域。

局部变量:在函数内部声明的变量是局部变量,只能在这个函数内部使用,函数外部不可用。

全局变量:在任何函数外面声明的变量;或是未经声明在函数内部直接简单使用的变量。

全局对象:每个JavaScript环境有一个全局对象,当你在适当的地方使用this的时候可以访问到。你创建的每一个全局变量都是这个全局对象的属性或数组元素。在浏览器中,为方便起见,该全局对象有个附加属性叫做window,此window(通常)指向该全局对象本身。

 

posted @ 2017-10-24 16:23  铠甲巨人  阅读(212)  评论(0编辑  收藏  举报