javascript笔记--尚学堂--白鹤翔 20140828

*************************************************************************************************
001
<!--
          <script type="text/javascript" charset="utf-8"  >
              
                    // helloworld
                    //浏览器对象 window 弹出警告框
                    //window.alert('hello javascript! my comming....');
                    //文档的对象
                    //document.write('我是第一个程序...!');
                   
                    //把内容打印到控制台
                    //console.info('hello js!!!');
                   
              
          </script>
          -->
          <!-- 外部引入文件 src属性 -->
          <!-- 解析顺序 从上到下 边解析边执行 -->
          <!-- 延迟执行:defer 可以延迟执行代码(当页面都加载完毕以后 window.onload)  -->
          <script type=text/javascript charset=utf-8 defer="defer" src='../commons/001.js'></script>
          <script type=text/javascript charset=utf-8 >
               alert('我是内部代码!!!!');
          </script>

*************************************************************************************************
002--
<script type=text/javascript charset=utf-8>
                        
                    //关于全局变量和局部变量的简单说明
                        
                    /*
                    var a = 3 ;          // number     全局变量
                   
                    //变量一共有两种: 全局变量 局部变量
                   
                    function test(){
                         //var b = 2 ;          //局部变量
                         c = 5 ;                    //全局变量
                         alert(a);
                    }
                   
                    test();
                    alert(c);
                    //alert(b);
                    */
                   
                   
                    //javascript是弱类型变量的脚本语言 ,根据赋值决定变量的类型
                   
                   
                    // Number类型 整数和小数
                   
                    var a1 = 10 ;
                    var a2 = 10.5 ;
                    var a3 = NaN;           //not a number
                    var a4 = 1/0 ;          //正无穷
                    var a5 = 070;          //8进制 和16进制(0xA)
                    //alert(a4);
                    //alert(a5);
                   
                    /*                   
                    var a6 = 0.1 ;
                    var a7 = 0.2 ;
                    if(a6+ a7 == 03){
                         alert('等于0.3');
                    } else {
                         alert('不等于0.3');
                    }
                    */
                    var a8 = parseInt("aaabbcc"); //不是一个数
                    //alert(a8);
                   
                    var a9 = parseInt("12bbcc");
                    //alert(a9);
                   
                   
                    //undefined 数据类型 他的值只有一个:undefined 表示变量声明了,但是没有被赋值
                    var b1  ;
                    //alert(b1);
                   
                    //Null 空值
                    var b2 =  null ;
                    //alert(b2);
                   
                    //String
                    var str1 = "我是字符串1";
                    var str2 = '我是字符串2';
                   
                    // Boolean
                    var flag1 = false ;
                    var flag2 = true ;
                   
                   
                    // 引用数据类型
                    var arr = [1,2,3];          //数组类型
                    var dates = new Date();     //日期类型
                    var obj = {};               //空对象
                   
                   
                    // typeof 操作符  用来判断数据类型的
                   
                    var a = 10 ;
                    var b = 10.3 ;
                    var c = true ;
                    var d = 'abcd';
                    var e = new Date();
                    var f = NaN ;
                    var g = [1,2,3];
                    var h = undefined ;
                    var i = null;          //表示一个空对象的引用
                    alert(typeof i);
                   
                   
                   
                   
                   
                   
              
          </script>
*************************************************************************************************
003--
/*
                    var a1 = 10 ;
                    var a2 = 10.0 ;
                   
                    if(a1 == a2){
                         alert('相等');
                    }
                    */
                   
                    //js数据自动转换的机制
                   
                    /*
                    var a = "1" ;           //number
                    var b = true ;           //boolean
                   
                    // == 表示 可以经过自动转换 比较的是数值
                    // === 表示 可以经过自动转换 先比较值, 再比较数据类型
                    if(a == b){
                         alert('相等');
                    } else {
                         alert('不等');
                    }
                    */
                    //三目运算符:
                    //var c = 10/2>4?5:3;
                    //alert(c);

*************************************************************************************************
004--
<script type=text/javascript charset=utf-8>
              
                    /**
                    *      数组本身也是对象
                    *      js中数组类似于java里的map容器 长度可随意改变 ,元素类型任意
                    *
                    */
                    //  var arr = new Array();
                    //      var arr = [1,2,3,4,true ,'abc' , new Date()] ;
                    //  alert(arr.length);
                    //  arr.length = 5 ;
                    //  alert(arr.toString()); // [object object]
                   
                   
                    /**
                    *  push 和 pop 方法
                    */
                    //var arr = [new Date(),false] ;
                    //var result = arr.push(1,2,true);     //push方法向数组中追加元素(返回值为新数组的长度)
                    //alert(arr);
                    //alert(result);
                    //var obj = arr.pop();          //从数组的尾部移除一个元素(返回值为移除的元素)
                    //alert(arr);
                    //alert(obj);
                   
                    /**
                    * shift 和 unshift 方法
                    */
                    //var  arr = [1,2,3, true , new Date()];
                    //var r1 = arr.shift();               //从头部移除一个元素(返回移除的元素)
                    //alert(arr);
                    //alert(r1);
                    //var r2 = arr.unshift(10,false);     //从头部插入多个元素(返回新数组的长度)
                    //alert(arr);
                    //alert(r2);
                   
                    /**
                    * splice、slice 方法 (截取的方法)
                    * splice方法操作数组本身
                    * slice方法不操作数组本身
                    *
                    */
                   
                    // splice: 第一个参数 :起始位置
                    //               第二个参数 :表示截取的个数
                    //                第三个参数以后:表示追加的新元素个数
                   
                    //var arr = [1,2,3,4,5];
                    //arr.splice(1,2,3,4,5);     // 134545
                    //alert(arr);
                   
                    // slice://返回截取的内容 //截取范围 (左闭右开区间)
                    //var arr = [1,2,3,4,5];
                    //var reuslt = arr.slice(2,4);  
                    //alert(reuslt);          //3,4    
                   
                    //操作数组的方法: concat join
                   
                    //var arr1 = [1,2,3];
                    //var arr2 = [true , 4 , 5];
                   
                    //var reuslt = arr1.concat(arr2);          //合并粘连的操作(不操作数组本身)
                    //alert(reuslt);
                   
                    //var result = arr1.join('-');          //在每个元素之间加入内容(不操作数组本身)
                    //alert(arr1);
                    //alert(result);
                   
                    /**
                    * sort排序
                    * reverse倒叙
                    */
                    var arr1 = [5,2,1,4,3];
                    var arr2 = [10,2,4,1,7];
                   
                    //arr1.sort();
                    //arr1.reverse();          //倒叙排序 是按照集合的位置进行倒叙的
                    //alert(arr1);
                    //arr2.sort();
                    //alert(arr2);          // 1 10 2 4 7
                   
                    function compare(value1 , value2){
                         if(value1 < value2){
                              return -1 ;
                         } else if(value1 > value2){
                              return 1 ;
                         } else {
                              return 0 ;
                         }
                    }
                    arr2.sort(compare);
                    alert(arr2);
                   
                   
                   
          </script>

*************************************************************************************************
005--
<script type=text/javascript charset=utf-8>
                             
                              var arr = [1,2,3,4,5,4,3,2,1];
                             
                              /*
                              //新加位置的方法: indexOf lastIndexOf
                              // 1个参数的时候表示传值 返回索引位置(index从0开始)
                              //var index = arr.indexOf(4);
                              // 2个参数的时候 第一个参数表示起始位置 第二个参数还是值
                              //var index = arr.indexOf(4,4);
                              //alert(index);
                              //他们查找数组比较的时候 '==='    
                              // lastIndexOf
                              //var index = arr.lastIndexOf(2);
                              //alert(index);
                              */
                             
                              //5个新加迭代的方法
                              //every :对于数组每一个元素进行一个函数的运行 如果都返回true 最后则返回true 如果有一个返回false最后结果则返回false
                              /*
                              var result = arr.every(function(item , index , array){
                                   return item > 2 ;
                              });
                              alert(result);
                              */    
                              //filter :对于数组的每一个元素进行一个函数的运行 给定的函数去执行 把过滤后的结果返回
                              /*
                              var result = arr.filter(function(item , index , array){
                                   return item > 2 ;
                              });
                              alert(result);
                              */
                              //forEach :循环数组每一项的值 并执行一个方法
                              /*
                              arr.forEach(function(item, index, array){
                                        alert(item);
                              });
                              */
                              //map 对于数组的每一个元素进行一个函数的运行 可以经过函数执行完毕后 把新的结果返回
                              /*
                              var result = arr.map(function(item, index, array){
                                   return item*2;
                              });
                              alert(result);                             
                              */
                              //some :对于数组每一个元素进行一个函数的运行 如果有一项返回true 最后则返回true 如果每一项都返回false最后结果则返回false
                              /*
                              var result = arr.some(function(item, index, array){
                                   return item >=5 ;
                              });
                              alert(result);
                              */
                             
                              //reduce    reduceRight
                              //变量的起始位置不同 
                              //前一个值 , 当前值 , 索引位置 , array
                              /*
                              var result = arr.reduce(function(prev , cur , index , array){
                                             return prev + cur ;
                              });
                              alert(result);
                              */
                              /*
                              var result = arr.reduceRight(function(prev , cur , index , array){
                                             return prev + cur ;
                              });
                              alert(result);
                              */                             
          </script>

*************************************************************************************************
004-arrayECMA5
<script type=text/javascript charset=utf-8>
                             
                              var arr = [1,2,3,4,5,4,3,2,1];
                             
                              /*
                              //新加位置的方法: indexOf lastIndexOf
                              // 1个参数的时候表示传值 返回索引位置(index从0开始)
                              //var index = arr.indexOf(4);
                              // 2个参数的时候 第一个参数表示起始位置 第二个参数还是值
                              //var index = arr.indexOf(4,4);
                              //alert(index);
                              //他们查找数组比较的时候 '==='    
                              // lastIndexOf
                              //var index = arr.lastIndexOf(2);
                              //alert(index);
                              */
                             
                              //5个新加迭代的方法
                              //every :对于数组每一个元素进行一个函数的运行 如果都返回true 最后则返回true 如果有一个返回false最后结果则返回false
                              /*
                              var result = arr.every(function(item , index , array){
                                   return item > 2 ;
                              });
                              alert(result);
                              */    
                              //filter :对于数组的每一个元素进行一个函数的运行 给定的函数去执行 把过滤后的结果返回
                              /*
                              var result = arr.filter(function(item , index , array){
                                   return item > 2 ;
                              });
                              alert(result);
                              */
                              //forEach :循环数组每一项的值 并执行一个方法
                              /*
                              arr.forEach(function(item, index, array){
                                        alert(item);
                              });
                              */
                              //map 对于数组的每一个元素进行一个函数的运行 可以经过函数执行完毕后 把新的结果返回
                              /*
                              var result = arr.map(function(item, index, array){
                                   return item*2;
                              });
                              alert(result);                             
                              */
                              //some :对于数组每一个元素进行一个函数的运行 如果有一项返回true 最后则返回true 如果每一项都返回false最后结果则返回false
                              /*
                              var result = arr.some(function(item, index, array){
                                   return item >=5 ;
                              });
                              alert(result);
                              */
                             
                              //reduce    reduceRight
                              //变量的起始位置不同 
                              //前一个值 , 当前值 , 索引位置 , array
                              /*
                              var result = arr.reduce(function(prev , cur , index , array){
                                             return prev + cur ;
                              });
                              alert(result);
                              */
                              /*
                              var result = arr.reduceRight(function(prev , cur , index , array){
                                             return prev + cur ;
                              });
                              alert(result);
                              */                             
          </script>

*************************************************************************************************
005--
<script type=text/javascript charset=utf-8>
                   
                    //Object 所有类的基础类
                   
                    //var obj = new Object();
                    var obj = {} ;          // 实例化对象
                    // 给对象设置属性
                    obj.name = '张3';
                    obj.age  = 20 ;
                    //obj.sex  = '男';
                    obj["birthday"] = '1980-08-07';
                    obj.say = function(){
                         alert('hello world!');                        
                    }
                   
                    // 访问对象的属性或方法
                    //alert(obj.name);
                    //alert(obj.age);
                    //obj.say();
                   
                    // delete 操作符 删除对象的属性或方法的
                    /*
                    delete obj.age ;
                    delete obj.say ;
                   
                    alert(obj.name);
                    alert(obj.age);
                    alert(obj.sex);
                    obj.say();
                    */
                   
                    // 如何去变量一个js对象  for in 语句式
                    /*
                    for(var attribute in obj) {
                         alert(attribute +" : "+ obj[attribute]);
                    }
                    */
                    //Constructor保存对象的创建函数
                    //alert(obj.constructor);
                    //var arr = [] ;
                    //alert(arr.constructor);
                   
                    //hasOwnProperty(propertyName) 用于检测给定属性在对象中是否存在
                    //alert(obj.hasOwnProperty('sex'));
                   
                    //isPrototypeOf(Object) 检测原型
                   
                    //检测给定的属性是否能被for in 所枚举出来
                    //alert(obj.propertyIsEnumerable('say'));
              
              
              
          </script>

*************************************************************************************************
006--
<script type=text/javascript charset=utf-8>
              
              
                    function Map(){
                        
                         // private
                         var obj = {} ;// 空的对象容器,承装键值对
                        
                         // put 方法
                         this.put = function(key , value){
                                   obj[key] = value ;          // 把键值对绑定到obj对象上
                         }
                        
                         // size 方法 获得map容器的个数
                         this.size = function(){
                                   var count = 0 ;
                                   for(var attr in obj){
                                        count++;
                                   }
                                   return count ;
                         }
                        
                         // get 方法 根据key 取得value
                         this.get = function(key){
                              if(obj[key] || obj[key] === 0 || obj[key] === false){
                                   return obj[key];
                              } else {
                                   return null;
                              }
                         }
                        
                         //remove 删除方法
                         this.remove = function(key){
                              if(obj[key] || obj[key] === 0 || obj[key] === false){
                                   delete obj[key];                             
                              }
                         }
                        
                         // eachMap 变量map容器的方法
                         this.eachMap = function(fn){
                                   for(var attr in obj){
                                        fn(attr, obj[attr]);
                                   }
                         }
                        
                        
                    }
              
                    //模拟java里的Map
                    var m = new  Map();
                    m.put('01' , 'abc');
                    m.put('02' , false) ;
                    m.put('03' , true);
                    m.put('04' , new Date());
                   
                    //alert(m.size());
                   
                    //alert(m.get('02'));
                    //m.remove('03');
                    //alert(m.get('03'));
                   
                    m.eachMap(function(key , value){
                         alert(key +" :"+ value);
                    });
              
          </script>

*************************************************************************************************
007--
<script type=text/javascript charset=utf-8>
              
              
               var arr = [2,1,2,10,2,3,5,5,1,10,13];     //object
              
              
               // js对象的特性 : 在js对象中 key 是永远不会重复的
               /*
               var obj = new Object();
               obj.name = 'z3';
               obj.age = 20 ;
               //alert(obj.name);
               obj.name = 'w5';
               alert(obj.name);
               */
              
               // 1 把数组转成一个js的对象
               // 2 把数组中的值,变成js对象当中的key
               // 3 把这个对象 再还原成数组
              
               // 把数组转成对象
               function toObject(arr){
                    var obj = {} ; // 私有的对象
                    var j ;
                    for(var i=0 , j= arr.length ; i<j; i++){
                              obj[arr[i]] = true ;
                    }
                    return obj ;
               }
              
               // 把这个对象转成数组
               function keys(obj){
                    var arr = [] ; // 私有对象
                    for(var attr in obj){
                         if(obj.hasOwnProperty(attr)){          //YUI底层代码
                              arr.push(attr);
                         }
                    }
                    return arr ;
               }
              
               //综合的方法 去掉数组中的重复项
               function uniq(newarr){
                    return keys(toObject(newarr));
               }
              
               alert(uniq(arr));
                        
          </script>

*************************************************************************************************
008--
<script type=text/javascript charset=utf-8>
              
               /*
               //Global 全局的 终极的 兜底的对象  (不存在的)
              
               var uri = 'http://www.bjsxt.com cn';
               //encodeURI 、encodeURIComponent
               var str1 =      encodeURI(uri); // %20               // (url : // 不会进行编码)
               var str2 =      encodeURIComponent(uri);          //常用的方法 (任何不标准的文字都会进行编码)
              
               //alert(str1);
               //alert(str2);
               //decodeURI、decodeURIComponent
               //alert(decodeURI(str1));
               //alert(decodeURIComponent(str2));
               */
              
               /*
               //eval(string) 方法 无形的javascript解析器
              
               //var str1 = "var a = 10 ; var b = 20;";
               //eval(str1);
               //alert(a+b);
               // 数组字符串 直接使用: eval(stringarr);
               // {name:z3 , age:20}
               var strobj = "{name:'z3' , age:20}";
               var obj = eval('('+strobj+')');
               alert(obj.name);
               */
              
              
               //parseInt parseFloat
               /*
               var num1 = parseInt('20');
               var num2 = parseFloat('20.5');
               alert(num1 + '   ' + num2);
               alert(typeof num1);
               alert(typeof num2);
               */
              
               //escape unescape   URI
              
               /*
               var str1 = '尚学堂';
               var str2 = escape(str1);
               alert(str2);
               var str3 = unescape(str2);
               alert(str3);
               */
               /*
               //isNaN // 如果不是number类型 true  是number类型 false
              
               var num1 = '10';
               var num2 = 'abcd10e';
               alert(isNaN(num2));
              
               //在js里面 只有NaN 自己不等于自己本身的
              
               if(NaN == NaN){
                    alert('相等');
               } else {
                    alert('不等')
               }
               */
              
               /*
               //Date 日期类型
              
               var date = new Date();
               //alert(date);
              
               var year = date.getFullYear();
               var month = date.getMonth() + 1 ;
               var da   = date.getDate();
               var day  = date.getDay();
               var hours = date.getHours();
               var min   = date.getMinutes();
               var sc    = date.getSeconds();
               document.write('今天是' + year + '年' + month + '月 ' + da+ '日' + hours +':' + min +':' +sc+ '星期' +day );
               document.write('\n' + date.getTime());
               */
              
              
              
          </script>
*************************************************************************************************
009--
<script type=text/javascript charset=utf-8>
              
              
                    //简单的一个函数: function关键字+函数的名字 (没有返回值类型)
              
                    //参数列表相当于函数的入口, return 相当于函数的出口
                    /*
                    function  test(a ,b){
                         //alert(a+b);
                         //alert(111);
                         return a+b;
                    }
                    var c = test(10 , 20);
                    //alert(c);
                    alert(typeof test);          //函数也是一种数据类型 (function类型)
                    */
                   
                    function test1(aa){
                         aa();
                    }
                    function test2(){
                         alert('执行啦');
                    }
                    test1(function(){ alert('我也执行啦!')});
                   
                   
                    // 在js中函数是可以嵌套定义的 (尽量不要这样去定义)
                    function test3(){
                         function test4(){
                              alert('我是test4!');
                         }
                         test4();
                    }
                   
                    test3();
                   
              
              
          </script>
*************************************************************************************************
010--
<script type=text/javascript charset=utf-8>
              
               // 3种方式定义函数
               /*
               // 1 function语句式
               function test1(){
                    alert('我是test1');
               }
               //test1();
              
               // 2函数的直接量 ECMAScript
               var test2 = function(){
                    alert('我是test2');
               }
               //test2();
              
               // 3function构造函数式
               var test3 = new Function("a" , "b" ,"return a+b;");
               //alert(test3(10,20));
               */
              
              
               //效率对比
               /*
               var d1 = new Date();
               var t1 = d1.getTime();
               for(var i =0 ; i <100000;i++){
                    //function test1(){;}          //function语句的形式
                    var test2 = new Function();
               }
               var d2 = new Date();
               var t2 = d2.getTime();
               alert(t2 -t1);               
               */
              
               // 解析顺序问题 对于function语句式的函数,javascript解析器会优先的解释
               /*
               test1();
               function test1(){
                    alert('1111');
               }
               */
              
               //alert(test2); //表示变量声明了 但是没有被赋值
              
               //test2();
               /*
               var test2 = function(){
                    alert('2222');
               }
               */
              
               /*
               // 4 2 3 3 5 6
               function f(){return 1;}                     // 函数1     
               alert(f());          //返回值为4 说明第1个函数被第4个函数覆盖    
               var f = new Function("return 2;");          // 函数2
               alert(f());          //返回值为2 说明第4个函数被第2个函数覆盖
               var f = function(){return 3;}               // 函数3
               alert(f());            //返回值为3 说明第2个函数被第3个函数覆盖    
               function f(){return 4;}                     // 函数4
               alert(f());          //返回值为3 说明第4个函数被第3个函数覆盖
               var f = new Function("return 5");           // 函数5
               alert(f());     //返回值为5 说明第3个函数被第5个函数覆盖    
               var f = function(){return 6 ;}               // 函数6
               alert(f());          //返回值为6 说明第5个函数被第6个函数覆盖              
               */
              
              
              
               //函数作用域的概念
               /*
               var k = 1 ;
               function t1(){
                    var k = 2 ; //局部变量 k
                    //function test(){return k ;}      //function语句
                    //var test = function(){ return k};     //函数直接量
                    //var test = new Function('return k;');     // 构造函数的方式
                    alert(test());
               }
               t1();              
               */
              
              
              
              
          </script>
*************************************************************************************************
011--
<script type=text/javascript charset=utf-8>
              
                         // function参数
                        
                         //形参列表
                         /*
                         //js中 函数的参数: 形参 实参
                         function test(a,b){
                              //alert(test.length);          // 4个
                              //函数的实际参数 内部就是用一个数组去接受函数的实际参数
                              // arguments 对象 可以访问函数的实际参数
                              // arguments 对象 只能在函数的内部访问和使用
                              //alert(arguments.length);
                              //alert(arguments[0]);
                              //alert(arguments[1]);
                              if(arguments.callee.length == arguments.length){
                                   return a+b;
                              } else {
                                   return '参数不正确!';
                              }
                              //arguments对象 用的最多的 还是做递归操作
                              //arguments.callee
                         }
                         alert(test(10,20));          // 30    
                         */
                        
                         /*
                       function fact(num){
                                   if(num <=1) return 1 ;
                                   else  return num*arguments.callee(num-1);
                         }         
                         //alert(fact(5));    
                         var F = fact ;
                         fact = null;
                         alert(F(5));         
                         */
                        
          </script>

*************************************************************************************************
012--
<script type=text/javascript charset=utf-8>
              
                         // this:this对象是指在运行时期基于执行环境所绑定的
                         // this总是指向调用者,也就是说 谁调用了我 我就指向谁
                        
                         /*
                         var k = 10 ;
                         function test(){
                              this.k = 20 ;
                         }
                         //window.test();
                         window.test();
                         //alert(test.k); undefined
                         alert(k);
                         */
                        
                        
              
              
          </script>
*************************************************************************************************
013--
<script type=text/javascript charset=utf-8>
              
               //call apply  简单的用法:绑定一些函数 用于传递参数 调用
              
               /*
               function sum(x , y){
                    return x+y;
               }
               function call1(num1 , num2){
                    return sum.call(this , num1 , num2);
               }
               function apply1(num1 , num2){
                    return sum.apply(this , [num1,num2]);
               }
               alert(call1(10 , 20));
               alert(apply1(20,40));
               */
              
               //扩充作用域
              
               /*
               window.color = 'red';
               var obj = {color:'blue'};
               var obj2 = {color:'yellow'};
               function showColor(){
                    alert(this.color);
               }
              
               //showColor.call(window);
               //showColor.call(obj);
               */
              
              
              
               // call方法的简单模拟与实现
              
               //function 方法
               function test1(a , b){
                    return a+b;
               }
              
               // 自定义的对象
               function Obj(x, y){
                    this.x = x ;
                    this.y = y ;
                    return x*y;
               }
              
               var o = new Obj(10 , 20);
               o.method = test1 ;
               alert(o.method(o.x , o.y));
               delete o.method;
              
               //alert(test1.call(o,o.x ,o.y));
              
              
              
              
              
              
          </script>

*************************************************************************************************
014--
<script type=text/javascript charset=utf-8>
              
               //1 执行环境 window对象(最上层的执行环境)
              
               var color1 = "blue";
               function changeColor(){ // 每一个函数 都有一个执行环境 (variable obj)
                    var color2 = "red";
                    function swapColor(){          // 这个函数 又产生了一个执行环境 (variable obj)
                   
                         // c3 3级作用域  c2 2级作用域 c1 1级作用域
                         var color3 = color2;
                         color2 = color1;
                         color1 = color3;
                         //这里可以访问:color1、2、3
                    }
                   
                    //这里可以访问color1、color2、但不能访问color3
                    swapColor();
               }
               //这里只能访问color1
               changeColor();          // 作用域 window  第一个作用环境    
              
               // 环境变量 可以一层一层的向上进行追溯 可以访问它的上级 环境(变量和函数)
               // 一层一层的像上追溯
              
          </script>
*************************************************************************************************
015--
<script type=text/javascript charset=utf-8>
              
              
               //垃圾收集 方法1 标记方法  2 引用计数法
               /*
               function test(){
                    var a = 10 ;      //被使用  
                    var b = 20 ;     //被使用
                    var c ;
               }
               test(); //执行完毕 之后 a、b又被标记了一次 :没有被使用
               */
              
              
               //块级作用域的概念
              
              
               //高级程序语言 java  for  if 块级作用域的概念、
               // js 没有块级作用域的概念
               /*
               function test(){
                    for(var i = 1 ; i <=5; i++){  //i
                         alert(i);
                    }
                    //alert(i);  //6
               }
               */
               //test();
              
               // js : () 表示执行
               /*
               function test(){
                    (function(){
                         for(var i = 1 ; i <=5; i++){  //i
                              alert(i);
                         }                             
                    })();
                    alert(i);
               }
               test();
               */
              
               //(function(){alert('我直接执行了!');})();
              
          </script>
*************************************************************************************************
016--
<script type=text/javascript charset=utf-8>
              
              
               /*
               var name = "xiao A";
               var obj = {
                     name : "xiao B" ,
                     getName: function(){
                         return function(){
                              return this.name;
                         }
                    }
               };
               //alert(obj.getName()());              
               var k = obj.getName();  //全局作用域
               //alert(typeof k); // function类型
               alert(k());
               */

               /*
               var name = "xiao A";
               var obj = {
                     name : "xiao B" ,
                     getName: function(){
                           // this总是指向调用者
                         var o = this;
                        
                         return function(){
                              return o.name;
                         }
                    }
               };
               //alert(obj.getName()());    
              
               var k = obj.getName();
               alert(k());
               */
              
              
               // 闭包:一个函数 可以访问另外一个函数作用域中的变量
               // 封闭性 : private 起到一个保护变量的作用
               // 1
               function f(x){          // 2
                              var temp = x ;           //局部变量     //temp已经没有被使用    
                              return function(x){          // 3 (function 有了一个执行域 var obj)
                                   temp += x ;          //  又被使用了                             
                                   alert(temp);                             
                              }
               }                   
               var a = f(50);
               //alert(a);
              
               a(5);                   
               a(10);
               a(20);              
              
              

              
          </script>
*************************************************************************************************

 

posted @ 2020-02-29 12:18  my_flash  阅读(27)  评论(0)    收藏  举报