1. javascript无块级作用域,变量在函数内部可见。
- function func_scope(){
- var x=1;
- if (true) {
- var x=2;
- if (true) {
- var x=3;
- alert(x);
- }
- alert(x);
- }
- alert(x);
- }
- func_scope();
这个地方具体是一个x变量,还是3个真不清楚?其实也没人有毛病这样定义变量
输出:
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.只要在函数内部声明变量使用了var,不管是if(false){var aa}, 他都是局部变量;反之,是全局变量;
* 2.声明所有的变量都应该加上var,防止产生歧义;
* 3.尽量避免引入全局变量。