js学习--变量作用域
Posted 铸剑师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js学习--变量作用域相关的知识,希望对你有一定的参考价值。
作为一名菜鸟的我,每天学点的感觉还是不错的。今天学习闭包的过程中看到作用域与作用域链这两个概念,我觉得作为一名有追求的小白,有必要详细了解下。
变量的作用域
就js变量而言,有全局变量和局部变量。这里我觉得这个按字面意思理解就行了.......下面举个例子
var message = "今天我做的糯米蒸排骨"; //定义一个全局变量 function doL(){ var ss = "侠客行很好看"; //定义一个局部变量 alert(message); //输出"今天我做的糯米蒸排骨",在函数中可以引用到全局变量 function alertDo(){ alert(ss); } alertDo(); //输出"侠客行很好看",这就涉及变量的作用域了 }; doL(); alertDo(); //没法输出 alertDo is not defined alert(message); //可以输出"今天我做的糯米蒸排骨"
这边有2个很有意思的地方
1.当变量不用var声明的时候我们实际上声明了一个全局变量,好吧,这是错误的,看下面,num是一个全局变量,
而 mum = 1;
事实上是对属性赋值操作。首先,它会尝试在当前作用域链(如在方法中声明,则当前作用域链代表全局作用域和方法局部作用域etc。。。)中解析 mum ; 如果在任何当前作用域链中找到mum ,则会执行对mum 属性赋值; 如果没有找到mum ,它才会在全局对象(即当前作用域链的最顶层对象,如window对象)中创造mum 属性并赋值。
注意!它并不是声明了一个全局变量,而是创建了一个全局对象的属性。由于变量声明自带不可删除属性,比较var num = 1 跟 num = 1,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除。
var num =1; mum = 1;
2.变量声明会提前到函数顶部,其实之前已经遇到过了
var scope="global"; function t(){ console.log(scope); var scope="local" console.log(scope); } t();
它首先会输出undefined,然后才是scope,它会将变量提前声明并且覆盖局部变量,等价于下面这种情况
var scope="global"; function t(){ var scope; console.log(scope); scope="local" console.log(scope); } t();
以上是关于js学习--变量作用域的主要内容,如果未能解决你的问题,请参考以下文章