// JavaScript 脚本,解析型语言 // var ABCD = function(){ var pub = {}; var pri = {}; pri.name = "myhere"; pri.age = 23; //var ABCDE; pub.setName = function( newName){ pri.name = newName; }; // 这里 pub.getName 被赋值为一个函数,就是定义一个函数 // 这个函数并没有运行,这个函数中的变量(不管是 local 还是 global 都不会被替换为他的值) // 因此这个 pri.name 还是一个变量,是动态的 pub.getName = function(){ return pri.name; } // 这里 pub.N 是一个值,是函数的返回值 // 而且这个值是不会随 pri.name 的改变而改变 // 因为 pub.N 是匿名函数以 pri.name 为参数调用匿名函数后的返回值 // 这个 pub.N 只能是程序运行到这时的 pri.name 值 // pub.N 也可以通过 ABCD.N 来改变 pub.N = function( e){ return e; }( pri.name ); pub.setAge = function( newAge){ pri.age = newAge; } pub.getAge = function(){ return pri.age; } pub.setOK = function() pub.setA = function( s){ ABCDE = s; } pub.getA = function(){ return ABCDE; } return pub; }(); // 直接运行匿名函数,ABCD 是匿名函数的返回值,即匿名函数中的 pub // 运行到这时并没用定义 ABCDE; ABCD.setA( 'boy'); // 运行到这时定义 ABCDE,他的作用域是 global scope,通过 window['ABCDE'] 可以获得, // ABCDE 与 pri( 匿名函数中的) 的作用域不一样,pri 只有通过 ABCD 的接口可以访问 // 因此 ABCD 形成一个 scope。pub 相当于 php 中的 public,pri 相当于 private // // 如果在匿名函数中定义 ABCDE,则他的作用域就不是 global scope 了,他就和 pri 是同一个作用域了,属于 local scope // // javascript 中的函数可以赋值给变量( very important !!!!)。 // 函数有自己的 scope // 因此一个函数定义中可以嵌套很多函数,而其中的每个函数又有自己的 scope // 因此可以有很多嵌套的 scope;在这些嵌套的 scope 中,外层的 scope 中的 // 变量在内层 scope 中可见;内层 scope 中的变量在外层 scope 中不可见 // var a = "a "; var A = function(){ var pub = {}; var b = "b "; pub.setValue = function( v){ var c = v || 'c '; var setAge = function( v){ var d = v || 'd '; return a + b + c + d; } return setAge; }; pub.setB = function( v){ b = v; }; pub.getC = function(){ return c; }; return pub; }(); alert( A.setValue()() ); a = "hello "; A.setB( 'myhere '); alert( A.setValue( "zhanglin " )("jlu") ) // alert( A.getC() ); 这个是错误的,内层 scope 中的变量在外层 scope 中不可见