什么是闭包

  • 我个人理解闭包就是函数中嵌套函数,但是嵌套的那个函数必须是返回值,才构成闭包;
    //标准的闭包
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. C#遇见C++的江湖 不行!得不到就干掉

    C#  VS C++ C#代码遇见了非托管dll如何处理 问题:托管与非托管,兼容? 方法一:DllImport 托管调试助手 "PInvokeStackImbalance" Me ...

  2. Hive创建HBase,ES外部表

    1.创建HBase外部表 CREATE EXTERNAL TABLE `ods_women`( `rowkey` string COMMENT 'from deserializer', `articl ...

  3. [POJ1985] Cow Marathon 「树的直径」

    >传送门< 题意:求树的直径 思路:就是道模板题,两遍dfs就求出来了 Code #include <cstdio> #include <iostream> #in ...

  4. HDU5407 CRB and Candies 【LCM递推】

    HDU5407 CRB and Candies 题意: 计算\(LCM(C(n,0),C(n,1),C(n,2),\cdots,C(n,n-1),C(n,n))\) \(n\le 10^6\) 题解: ...

  5. SQL Server的嵌套存储过程中使用同名的临时表怪像浅析

      SQL Server的嵌套存储过程,外层存储过程和内层存储过程(被嵌套调用的存储过程)中可以存在相同名称的本地临时表吗?如果可以的话,那么有没有什么问题或限制呢? 在嵌套存储过程中,调用的是外层存 ...

  6. 浅谈Webpack模块打包工具四

    Webpack 生产环境优化 生产环境和开发环境有很大的差异,生产环境只注重运行效率,开发环境主要开发效率,webpack4.0开始提出了(mode)模式的概念 针对不同的环境进行不同的配置,为不同的 ...

  7. 网络之一次http请求的完整过程

    关于网络的知识平时可能真正用的比较少,但是有一些点还是需要总结的: 完成一次http请求要大致可以分为7个步骤: 一.TCP三次握手 第一次握手:建立连接.客户端发送连接请求报文段,将SYN位置为1, ...

  8. Ansible主机清单Inventory文件hosts

    Ansible主机清单Inventory文件hosts 发表于 2017-05-14 | 分类于 运维相关 , Ansible | | 阅读次数 4638 | 字数统计 1,442 | 阅读时长预计 ...

  9. Leetcode(28)-实现strStr()

    实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...

  10. CN_Week2_Neuron_code

    CN_Week1_Neuron_code on Coursera Abstract for week2: -- 1. Technique for recording from the brain. - ...