// 1.闭包的作用
// 实现共有变量,函数累加器的实现
// 可以做缓存以及储存结构
// 可以实现封装,实现属性私有化
// 模块开发,防止全局污染
// var name = 123;
// var int = (function () {
// var name = 456;
// function inte() {
// console.log(name);
//
// }
// return inte();
// }());
// 2.递归实现n的阶乘,递归最重要的是找到规律以及出口;
// function mul(n) {
// if (n === 1){
// return 1
// }
// return n * mul(n - 1);
//
// }
//
// console.log(mul(7));
// 3.argument.callee的使用说明
// 当这个函数名称未知时,可以通过此方法来调用自身
// var num = (function (n) {
// if (n ===1){
// return 1
// }
// return n * arguments.callee(n - 1);
//
// }(10));
// console.log(num);
// 4.hasOwnProperty可以判断一个对象是否有名称的属性或对象,如果该属性
// 方法是该对象自己定义的而不是原型链中定义的则返回true,否则返回false
// 5.斐波那契数列,使用递归的方法来写
// function fb(n) {
// if (n === 1 || n ===2){
// return 1
// }
// return fb(n - 1) + fb(n - 2);
//
// }
// 6.浮动元素与浮动流
// 所有的产生了浮动流的元素,块级元素都看不到
// 产生了bfc的元素和文本类属性的元素以及文本都能看得到浮动元素
// 7.浅层克隆
// var obj = {
// name : "liu",
// age : 15,
// sex : "mal"
// };
// var obj1 = {};
// function clone(origin, target) {
// for (var prop in origin){
// target[prop] = origin[prop];
// }
//
// }
// clone(obj, obj1)
// 8.闭包
// 当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链
// 不被释放,,可以使用立即执行函数来解决闭包问题;
// 9.方法的借用
// function Person(name, age, sex) {
// this.name = name;
// this.age = age;
// this.sex = sex;
//
// }
// function Students(name, age, sex) {
// Person.call(this, name, age, sex)
// }
// var students = new Students("LIU", 16, "mal")
// 10.数组的常用方法
// 会改变原数组:push pop shift unshift sort reverse splice
// 不会改变原数组:concat, join——split , tostring, slice
// 11.完整的圣杯模式
// function Father() {
//
// }
// function Son() {
//
// }
// function inherit(Target, Origin) {
// function F() {}
// F.prototype = Origin.prototype;
// Target.prototype = new F();
// Target.prototype.constructor = Target;
//
// }
// inherit(Son, Father);
// var son = new Son();
// var father = new Father();