日期:2014-05-16  浏览次数:20422 次

javascript面向对象技术基础(六)(转载)

原文:javascript面向对象技术基础(六)

作用域、闭包、模拟私有属性
先来简单说一下变量作用域,这些东西我们都很熟悉了,所以也不详细介绍。

Js代码
  1. var ?sco?=? "global" ;?? //全局变量 ??
  2. function ?t()?{???
  3. ????var ?sco?=? "local" ;?? //函数内部的局部变量 ??
  4. ????alert(sco);?????????//local?优先调用局部变量 ??
  5. }??
  6. t();?????????????//local ??
  7. alert(sco);???????//global??不能使用函数内的局部变量 ??
var sco = "global";  //全局变量
function t() { 
    var sco = "local";  //函数内部的局部变量
    alert(sco);         //local 优先调用局部变量
}
t();             //local
alert(sco);       //global  不能使用函数内的局部变量

?

注意一点,在javascript中没有块级别的作用域,也就是说在java或c/c++中我们可以用"{}"来包围一个块,从而在其中定义块内的 局部变量,在"{}"块外部,这些变量不再起作用,同时,也可以在for循环等控制语句中定义局部的变量,但在javascript中没有此项特性:

Js代码
  1. function ?f(props)?{??
  2. ????for ( var ?i=0;?i<10;?i++)?{}??
  3. ????alert(i);?????????//10??虽然i定义在for循环的控制语句中,但在函数 ??
  4. ??????????????????????//的其他位置仍旧可以访问该变量. ??
  5. ????if (props?==? "local" )?{??
  6. ????????var ?sco?=? "local" ;??
  7. ????alert(sco);???
  8. ????}??
  9. ????alert(sco);???????//同样,函数仍可引用if语句内定义的变量 ??
  10. }??
  11. f("local" );?????? //10??local???local ??
function f(props) {
    for(var i=0; i<10; i++) {}
    alert(i);         //10  虽然i定义在for循环的控制语句中,但在函数
                      //的其他位置仍旧可以访问该变量.
    if(props == "local") {
        var sco = "local";
	alert(sco); 
    }
    alert(sco);       //同样,函数仍可引用if语句内定义的变量
}
f("local");      //10  local   local

?

?在函数内部定义局部变量时要格外小心:

Js代码
  1. var ?sco?=? "global" ;??
  2. function ?print1()?{??
  3. ????alert(sco);???//global ??
  4. }??
  5. function ?print2()?{??
  6. ????var ?sco?=? "local" ;??
  7. ????alert(sco);???//local ??
  8. }??
  9. function ?print3()?{??
  10. ????alert(sco);???