javascript变量作用域的几个例子

2009年02月03日 | 5,650 次浏览 | 标签: | 1条评论  

1. javascript无块级作用域,变量在函数内部可见。和php类似。

function func_scope(){
    var x=1;
    if (true) {
        var x=2;
        if (true) {
            var x=3;
            alert(x);
        }
        alert(x);
    }
    alert(x);
}
func_scope();

输出:
3
3
3
2. 对象初始化可以对自身的属性执行修改,可以修改全局变量的值。

function foo(){
	foo.abc = function(){alert('def')};
	this.abc = function(){alert('xyz')};
	abc = function(){alert('@@@@@')};
	var abc = function(){alert('$$$$$$')};
}
foo.prototype.abc = function(){alert('456');}
foo.abc = function(){alert('123');}
var f = new foo();
f.abc();
foo.abc();
abc();

输出:
xyz
def
错误: abc is not defined (相应解释在第3个例子中)
3. 函数内,只要变量名前面出现var则该变量为局部变量。

var myVar =  "GLOBAL";
function foo() {
	// myVar已经在下面声明,但是在此之前却没有定义
	alert("myVar evaluates to '"+myVar+"'");
	// 这个myVar其实是局部变量
	myVar = "NEW_GLOBAL_VALUE";
	alert("myVar evaluates to '"+myVar+"'");
	// window.myVar指向全局的myVar
	alert("myVar evaluates to '"+window.myVar+"'");
	// 声明一个局部变量myVar,去掉这个则输出结果就完全不同
	var myVar = "LOCAL";
	alert("myVar evaluates to '"+myVar+"'");
}
foo();
alert("myVar evaluates to '"+myVar+"'");

输出:
myVar evaluates to ‘undefined’
myVar evaluates to ‘NEW_GLOBAL_VALUE’
myVar evaluates to ‘GLOBAL’
myVar evaluates to ‘LOCAL’
myVar evaluates to ‘GLOBAL’

对应第2个例子,foo中的abc(abc = function(){alert(‘@@@@@’)};)为局部变量,全局变量中没有定义过abc所以会报undefine的错误。

结论:
* 1.变量函数内可见;
* 2.只要在函数内部声明变量使用了var,则该变量在整个函数内部都是局部变量;
* 3.声明所有的变量都应该加上var,防止产生歧义;
* 4.尽量避免引入全局变量。

参考文档:
http://www.itmill.com/articles/Javascript_global_and_local_variable_scope.htm
http://birdshome.cnblogs.com/archive/2005/01/26/97885.html
http://www.planabc.net/2007/09/20/javascript_examination_questions/

相关文章

评论(1)

  1. 挑战书 发表于2009年06月19日 10:37 am

    学习了,这些例子很诡异

Trackbacks(1)

发表评论

最受欢迎

评论最多