什么是闭包

  • 我个人理解闭包就是函数中嵌套函数,但是嵌套的那个函数必须是返回值,才构成闭包;
    //标准的闭包
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. 嵌入式的我们为什么要学ROS

  2. 最好的IDEA debug长文?看完我佛了

    前言 你好,我是A哥(YourBatman). 最近写了几篇IntelliJ IDEA系列的文章,反响蛮好.我想了下,因为并非是分享什么破解方法.推荐插件.主题这种蛋炒饭式哗众取宠的文章,而是真实对工 ...

  3. 2020牛客暑期多校训练营(第一场)Easy Integration

    传送门:J. Easy Integration 题意:给你n,求这个积分,最后的结果分子是记为p,分母记为q. 求(p*q-1)mod 998244353. 题解:比赛完看到巨巨说这是贝塔函数,我一搜 ...

  4. hdu 4521 小明系列问题——小明序列 线段树

    题意: 给你一个长度为n的序列v,你需要输出最长上升子序列,且要保证你选的两个相邻元素之间在原数组中的位置之差大于d 题解: 这个就是原来求最长上升子序列的加强版,这个思路和最长上升子序列的差不多   ...

  5. [CodeForces-629A 用阶乘会爆掉

    题意: 给你一个n*n的蛋糕,如果某个位置是'C'那就代表这是一个巧克力块,否则就不是.如果某两个巧克力块在同一行或同一列,那么这个家庭的幸福值就会加1,问你这个家庭的幸福值最大是多少 Input 3 ...

  6. Jpress小程序

    首页轮播.首页公告.首页宫格.个人中心页面均支持在PC后台设置内容 首页列表.分类列表页.搜索列表的文章展示页均支持后台设置,拥有三种风格 所有分类展示支持两种风格 用户中心授权登陆,查看个人数据 J ...

  7. Codeforces 11D A Simple Task 统计简单无向图中环的个数(非原创)

    太难了,学不会.看了两天都会背了,但是感觉题目稍微变下就不会了.dp还是摸不到路子. 附ac代码: 1 #include<iostream> 2 #include<cstdio> ...

  8. C++的memset

    1. 需要的头文件 C中为<memory.h> 或 <string.h> C++中为<cstring> void * memset ( void * ptr, in ...

  9. codefoeces 864B

    B. Polycarp and Letters time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  10. C# 类 (10) - 命名空间NameSpace

    NameSpace 命名空间是一系列 类型的集合,比如很多方法,很多类,集合在一个空间(myspace)里,谁想用就先 using myspace,然后直接用不using myspace的话,想用里面 ...