javascript作用域概念的理解,局部变量提前声明理解。
首先,我们先看一个javascript的题目;
if (!("a" in window)) {
var a = 1;
}
alert(a);
大家先想想结果是什么...
要得到这个结果,那么我就必须知道javascript的作用域知识和javascript的局部变量声明提前的概念。
javascript作用域: 变量在声明他们的函数体内部的任何位置(包过这个函数体内嵌套的任何函数体内)都是可读取的。
局部变量声明提前:javascript局部变量在整个作用域开始声明(不会初始化), 在原出初始化。
我们程序员对概念一般都很难理解,那下面我们来解释下上面的小试题从而理解作用域和局部变量声明提前的概念。
首先,在if语句里面的判断in运算符。in运算符是用来判断对象是否存在对应的属性。例如:
eg: var ob = {}; "name" in ob ----- false
var ob = {"name": "xx"} "name" in ob ----- true
知道了in运算符之后我们再来看下作用域的问题:
我们知道java,c,c++,c#的作用域是块级作用域(以一对花括号来隔离作用域),花括号内的每一段代码都有各自的作用域,并且变量在声明他们的代码段之外是不可见的。
而javascript的作用域有些不一样。javascript中没有块级作用域的概念,javascript的作用域是函数作用域。即在函数内任何地方声明的变量,在这个函数内的任何地方都是可以访问的。
我们来看看试题,在if语句块内,我们声明定义了变量a,那么在本作用域(这里的代码是定义在全局对象中的,对客户端javascript来时就是window对象下,那么这里的作用域和全局作用域一样)中的任何地方都可以访问到变量a。还有局部变量在作用域内声明提前,那么我们可以这么理解代码:
var a;
if (!("a" in window)) {
a = 1;
}
alert(a);
那么在代码的第一行声明变量a时候,因为这是全局作用域,也就相当于给window添加a属性。
window.a = undefined;
if( !("a" in window)){
a = 1;
}
alert(a);
这么来计算的话,那么题目的结果就显而易见是undefined。
这个小题目对javascript的作用域还没有体现出来,但我们能够从中理解javascript的声明式提前。
下次会继续讲解javascript的作用域,this,等相关问题。有问题欢迎骚扰,一起探讨。
if (!("a" in window)) {
var a = 1;
}
alert(a);
大家先想想结果是什么...
要得到这个结果,那么我就必须知道javascript的作用域知识和javascript的局部变量声明提前的概念。
javascript作用域: 变量在声明他们的函数体内部的任何位置(包过这个函数体内嵌套的任何函数体内)都是可读取的。
局部变量声明提前:javascript局部变量在整个作用域开始声明(不会初始化), 在原出初始化。
我们程序员对概念一般都很难理解,那下面我们来解释下上面的小试题从而理解作用域和局部变量声明提前的概念。
首先,在if语句里面的判断in运算符。in运算符是用来判断对象是否存在对应的属性。例如:
eg: var ob = {}; "name" in ob ----- false
var ob = {"name": "xx"} "name" in ob ----- true
知道了in运算符之后我们再来看下作用域的问题:
我们知道java,c,c++,c#的作用域是块级作用域(以一对花括号来隔离作用域),花括号内的每一段代码都有各自的作用域,并且变量在声明他们的代码段之外是不可见的。
而javascript的作用域有些不一样。javascript中没有块级作用域的概念,javascript的作用域是函数作用域。即在函数内任何地方声明的变量,在这个函数内的任何地方都是可以访问的。
我们来看看试题,在if语句块内,我们声明定义了变量a,那么在本作用域(这里的代码是定义在全局对象中的,对客户端javascript来时就是window对象下,那么这里的作用域和全局作用域一样)中的任何地方都可以访问到变量a。还有局部变量在作用域内声明提前,那么我们可以这么理解代码:
var a;
if (!("a" in window)) {
a = 1;
}
alert(a);
那么在代码的第一行声明变量a时候,因为这是全局作用域,也就相当于给window添加a属性。
window.a = undefined;
if( !("a" in window)){
a = 1;
}
alert(a);
这么来计算的话,那么题目的结果就显而易见是undefined。
这个小题目对javascript的作用域还没有体现出来,但我们能够从中理解javascript的声明式提前。
下次会继续讲解javascript的作用域,this,等相关问题。有问题欢迎骚扰,一起探讨。