什么是闭包

  • 我个人理解闭包就是函数中嵌套函数,但是嵌套的那个函数必须是返回值,才构成闭包;
    //标准的闭包
function fn(){
var i=1;
return function fnn(){
i++;
return i;
}
}
$('#btn').click(function(){
var fun=fn();
console.log(fun());//2
console.log(fun());//3
});

闭包的用途

  • 让外部可以读取到函数内部的变量
  • 让这些变量的值始终保存的内存中(所以要尽量少使用闭包)

思考题:

<script>
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
alert(object.getNameFunc()());
</script>
<script>
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  }; 
 alert(object.getNameFunc()());
</script>
 //第一题结果是the windos
 //第二题结果是the object

创建对象

    //通过object创建对象
var person =new Object();
person.name='wj';
person.job='c#.net';
person.fn=function(){
console.log(this.name+this.job);
};
// person.fn();
//通过字面量创建对象
var conmpany={
name:"fanyaunwang",
salary:"6500",
fn:function(){
console.log(this.name+this.salary);
}
};
//conmpany.fn();
//以上2种方式创建对象,会产生大量的重复代码 //通过工厂模式创建对象
// 工厂模式减少了代码重复,但是不能识别对象,所有的实例都是object类型
function createObject(name,age,job)
{
var o = new Object();
o.name=name;
o.age=age;
o.job=job;
o.fn=function(){
console.log(this.name+this.job+this.age);
}
return o;
} //var wj=createObject('wj','22','c#.net');
//wj.fn(); //通过构造函数创建对象
//构造函数中首字母大写,而非构造函数首字母小写作为区别 function CreatePerson(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
this.fn=function(){
console.log(this.name+this.age+this.job);
}
}
//通过new来创建CreatePerson实例,这样创建的实例都有一个constractor
//属性指向CreatePerson
//通过工厂模式创建的对象都是object,无法判读对象的类型,
//但是通过构造函数创建的对象可以,这是构造函数创建对象胜过
//通过工厂模式创建对象的地方
var obi=new CreatePerson('wangjun','23','c#.net');
obi.fn();
console.log(obi.constructor==CreatePerson);//true //通过原型模式来创建对象
//原型模式就是在构造函数中吧方法拿出来的基础上,在做了一层封装 function Employee(){
}
Employee.prototype.name='wangjun';
Employee.prototype.age='c#';
Employee.prototype.fn=function(){
console.log(this.name+this.age);
}
var emp=new Employee();
var emp1=new Employee();
emp.fn();
emp1.fn();
//这个fn是公共的
console.log(emp.fn()==emp1.fn());//true
//在构造函数创建对象的模式中是false //构造函数和原型混合模式
//创建自定义类型的最常见方式
//构造函数模式用于定义实例属性,
//原型模式用于定义公共属性 function Customer(name,address)
{
this.name=name;
this.address=address;
this.phone=['13946','44848484'];
}
Customer.prototype={
constructor:Customer,
p:['af','sfasf'],
fnn:function(){
console.log(this.name+'prototype');
}
}
var objc= new Customer('fanyuanwang','shenzheng');
var obje=new Customer('wangjin','changsha');
console.log(objc.phone==obje.phone);//false
//上面这个就是构造函数的引用类型的不同
objc.fnn();
console.log(objc.fnn==obje.fnn);//true
objc.fnn();
});

格式化时间

  function getnowtime() {
var nowtime = new Date();
var year = nowtime.getFullYear();
var month = padleft0(nowtime.getMonth() + 1);
var day = padleft0(nowtime.getDate());
var hour = padleft0(nowtime.getHours());
var minute = padleft0(nowtime.getMinutes());
var second = padleft0(nowtime.getSeconds());
var millisecond = nowtime.getMilliseconds(); millisecond = millisecond.toString().length == 1 ? "00" + millisecond : millisecond.toString().length == 2 ? "0" + millisecond : millisecond;
return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second + "." + millisecond;
}
//补齐两位数
function padleft0(obj) {
return obj.toString().replace(/^[0-9]{1}$/, "0" + obj);
}

JavaScript疑难点的更多相关文章

  1. javascript技术难点(三)之this、new、apply和call详解

    4)    this.new.call和apply的相关问题 讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本 ...

  2. JS疑难点和GC原理

    js解析与序列化json数据(一)json.stringify()的基本用法: 对象有两个方法:stringify()和parse().在最简单的情况下,这两个方法分别用于把JavaScript对象序 ...

  3. javascript 重难点(原型链 this) 理解总有一个过程,不要急,循序渐进!

    开始补充: 1. 将函数定义作为对象的属性,称之为对象方法.2. this的指向是由它所在函数调用的上下文决定的(语境),而不是由它所在函数定义的上下文决定的.3. 因为当一个函数作为函数而不是方法来 ...

  4. javascript技术难点之this、new、apply和call详解

    讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本篇打算换一个思路从应用的角度来讲解this指针,从这个角度理解 ...

  5. 常见的几个js疑难点,match,charAt,charCodeAt,map,search

            JavaScript match() 方法 定义和用法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastI ...

  6. 说说常见的几个js疑难点

    JavaScript match() 方法 定义和使用方法 match() 方法可在字符串内检索指定的值,或找到一个或多个正則表達式的匹配. 该方法类似 indexOf() 和 lastIndexOf ...

  7. css与javascript重难点,学前端,基础不好一切白费!

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  8. TCP连接建立和关闭中的疑难点

    TCP连接建立和关闭中的疑难点 作者:夏语岚    撰写日期:2011-10-29 近日在阅读<Unix网络编程>,以前在<计算机网络>课程中学到TCP,当时只是简单了解了TC ...

  9. git的一些疑难点

    一 .git reset,git revert,git checkout的区别和联系 主要参考:http://www.cnblogs.com/houpeiyong/p/5890748.html git ...

随机推荐

  1. Web开发模型

    1.服务器 web服务器:pc机器安装一个具有web服务的软件,称之位web服务器 数据库服务器:pc机器安装一个具有数据管理件服务的软件,称之为web服务器 邮件服务器:pc机器安装一个具有发送邮件 ...

  2. POJ 1743 Musical Theme【SAM】

    POJ1743 Musical Theme 要找长度\(\ge 5\)且出现次数\(\ge 2\)并且第一次出现和最后一次出现不重叠的最长子串. 题目条件中,如果对于两个串,在一个串的每个数上都加上相 ...

  3. hdu1004 Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  4. CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数

    题意: 给出n个点m条公路k条铁路. 接下来m行 u v w      //u->v 距离w 然后k行 v w         //1->v 距离w 如果修建了铁路并不影响两点的最短距离, ...

  5. 数理统计9:完备统计量,指数族,充分完备统计量法,CR不等式

    昨天我们给出了统计量是UMVUE的一个必要条件:它是充分统计量的函数,且是无偏估计,但这并非充分条件.如果说一个统计量的无偏估计函数一定是UMVUE,那么它还应当具有完备性的条件,这就是我们今天将探讨 ...

  6. Kubernets二进制安装(10)之部署主控节点部署调度器服务kube-scheduler

    Kubernetes Scheduler是一个策略丰富.拓扑感知.工作负载特定的功能,调度器显著影响可用性.性能和容量.调度器需要考虑个人和集体的资源要求.服务质量要求.硬件/软件/政策约束.亲和力和 ...

  7. leetcode16 最接近的三数之和 双指针

    三个数循环太复杂 确定一个数,搜索另两个 先排序,之后就确定了搜索的策略 if(tp>target) while (l < r && nums[r] == nums[--r ...

  8. C++11特性-右值引用

    什么是左值,什么是右值 常见的误区有 = 左边的是左值,右边的是右值. 左值:具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables) ...

  9. acm的做题技巧

    1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好不要用cin.cout,防止超时. (或加上 1 ios ...

  10. LVS : Linux Virtual Server 负载均衡,集群,高并发,robust

    1 LVS : Linux Virtual Server http://www.linuxvirtualserver.org/ http://www.linuxvirtualserver.org/zh ...