JavaScript变量作用域

变量作用域是程序中定义这个变量的区域。

先贴一段代码,如果读者对代码输出并不感到困惑就不用往下面读了。

/* 代码1 */
var scope = global ;
function checkScope() {
var scope = local ;
function childCheck() {
var scope = childLocal ;
document.write(scope);
}
function childUndefined() {
document.write(scope);
var scope;
}
function childOverride() {
scope = childOverride ;
document.write(scope);
}
document.write(scope); //输出local
childCheck(); //输出childLocal
childUndefined(); //输出undefined
childOverride(); //输出childOverride
document.write(scope); //输出childOverride
}
checkScope(); //输出local childLocal undefinedchildOverride childOverride
document.write(scope); //输出global
全局作用域与局部作用域
全局(global)变量的作用域是全局的,在Javascript中处处有定义;而函数内部声明的变量是局部(local)变量,其作用域是局部性的,只在函数体内部有定义。对于下面的输出读者应不会感到意外。

/* 代码2 */
var scope = global;
function checkScope() {
var scope = local;
document.write(scope);
}
checkScope(); //输出local
document.write(scope); //输出global

全局变量作用域中使用变量可以不用var语句,但在声明局部变量是一定要使用var语句,否则会视为对全局变量的引用。看下面代码

/* 代码3 */
var scope = global;
function checkScope() {
scope = local;
document.write(scope);
}
checkScope(); //输出local
document.write(scope); //输出local

没有块作用域
Javascript没有块级作用域,函数中声明的变量在整个函数中都是有定义的。对于下面的代码对于生疏的读者可能颇感意外:

/* 代码4 */
var scope = global;
function checkScope() {
document.write(scope); //语句4.1
var scope = local; //语句4.2
document.write(scope);
}
checkScope(); //输出undefinedlocal

由于语句4.1(var scope = local;)声明的变量在整个checkScope函数作用域内都有效,因此在语句4.2(document.write(scope); )执行的时scope引用的是局部变量,而此时局部变量scope尚未定义,所以输出”undefined”。因此一个好的编程习惯是将所有的变量声明集中起来放在函数的开头。

在了解了上述内容之后,读者再看看代码1应该不会感到困惑了。

对象的属性变量

对象的属性变量比较容易理解,看一下下面的代码读者应该不会感到疑惑。 /* 代码5 */
var scope = global ;
var obj = new Object();
obj.scope = object ;
obj.checkScope = function () {
var scope = loacl ;
document.write(scope); //输出loacl
document.write(this.scope); //输出object
document.write(window.scope); //输出global
}
obj.checkScope(); //输出loacl object global

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...