JavaEye javascript面向对象技术基础(六)
转自:http://www.iteye.com/wiki/Object_Oriented_JavaScript/1317-javascript-object-oriented-technology-6
作用域、闭包、模拟私有属性
先来简单说一下变量作用域,这些东西我们都很熟悉了,所以也不详细介绍。
var sco = "global"; //全局变量 function t() { var sco = "local"; //函数内部的局部变量 alert(sco); //local 优先调用局部变量 } t(); //local alert(sco); //global 不能使用函数内的局部变量 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 var sco = "global"; function print1() { alert(sco); //global } function print2() { var sco = "local"; alert(sco); //local } function print3() { alert(sco); //undefined var sco = "local"; alert(sco); local } print1(); //global print2(); //local print3(); //undefined local 前面两个函数都很容易理解,关键是第三个:第一个alert语句并没有把全局变量"global"显示出来,function print3() { var sco; alert(sco); sco = "local"; alert(sco); } var scope = "global" //定义全局变量 function print() { alert(scope); } function change() { var scope = "local"; //定义局部变量 print(); //虽然是在change函数的作用域内调用print函数, //但是print函数执行时仍旧按照它定义时的作用域起作用 } change(); //golbal var i = 0; function getNext() { i++; return i; } alert(getNext()); //1 alert(getNext()); //2 alert(getNext()); //3 一直用getNext函数得到下一个整数,而后不小心或者故意的将全局变量i的值设为0,然后再次调用getNext,function temp() { var i = 0; function b() { return ++i; } return b; } var getNext = temp(); alert(getNext()); //1 alert(getNext()); //2 alert(getNext()); //3 alert(getNext()); //4 因为我们平时所说的javascript绝大多数都是指的在客户端(浏览器)下,所以这里也不例外。

function Person(name, age) { this.getName = function() { return name; }; this.setName = function(newName) { name = newName; }; this.getAge = function() { return age; }; this.setAge = function(newAge) { age = newAge; }; } var p1 = new Person("sdcyst",3); alert(p1.getName()); //sdcyst alert(p1.name); //undefined 因为Person('类')没有name属性 p1.name = "mypara" //显示的给p1添加name属性 alert(p1.getName()); //sdcyst 但是并不会改变getName方法的返回值 alert(p1.name); //mypara 显示出p1对象的name属性 p1.setName("sss"); //改变私有的"name"属性 alert(p1.getName()); //sss alert(p1.name); //仍旧为mypara