JavaScript疑难点
什么是闭包
- 我个人理解闭包就是函数中嵌套函数,但是嵌套的那个函数必须是返回值,才构成闭包;
//标准的闭包
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疑难点的更多相关文章
- javascript技术难点(三)之this、new、apply和call详解
4) this.new.call和apply的相关问题 讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本 ...
- JS疑难点和GC原理
js解析与序列化json数据(一)json.stringify()的基本用法: 对象有两个方法:stringify()和parse().在最简单的情况下,这两个方法分别用于把JavaScript对象序 ...
- javascript 重难点(原型链 this) 理解总有一个过程,不要急,循序渐进!
开始补充: 1. 将函数定义作为对象的属性,称之为对象方法.2. this的指向是由它所在函数调用的上下文决定的(语境),而不是由它所在函数定义的上下文决定的.3. 因为当一个函数作为函数而不是方法来 ...
- javascript技术难点之this、new、apply和call详解
讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本篇打算换一个思路从应用的角度来讲解this指针,从这个角度理解 ...
- 常见的几个js疑难点,match,charAt,charCodeAt,map,search
JavaScript match() 方法 定义和用法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastI ...
- 说说常见的几个js疑难点
JavaScript match() 方法 定义和使用方法 match() 方法可在字符串内检索指定的值,或找到一个或多个正則表達式的匹配. 该方法类似 indexOf() 和 lastIndexOf ...
- css与javascript重难点,学前端,基础不好一切白费!
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...
- TCP连接建立和关闭中的疑难点
TCP连接建立和关闭中的疑难点 作者:夏语岚 撰写日期:2011-10-29 近日在阅读<Unix网络编程>,以前在<计算机网络>课程中学到TCP,当时只是简单了解了TC ...
- git的一些疑难点
一 .git reset,git revert,git checkout的区别和联系 主要参考:http://www.cnblogs.com/houpeiyong/p/5890748.html git ...
随机推荐
- C#遇见C++的江湖 不行!得不到就干掉
C# VS C++ C#代码遇见了非托管dll如何处理 问题:托管与非托管,兼容? 方法一:DllImport 托管调试助手 "PInvokeStackImbalance" Me ...
- Hive创建HBase,ES外部表
1.创建HBase外部表 CREATE EXTERNAL TABLE `ods_women`( `rowkey` string COMMENT 'from deserializer', `articl ...
- [POJ1985] Cow Marathon 「树的直径」
>传送门< 题意:求树的直径 思路:就是道模板题,两遍dfs就求出来了 Code #include <cstdio> #include <iostream> #in ...
- 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\) 题解: ...
- SQL Server的嵌套存储过程中使用同名的临时表怪像浅析
SQL Server的嵌套存储过程,外层存储过程和内层存储过程(被嵌套调用的存储过程)中可以存在相同名称的本地临时表吗?如果可以的话,那么有没有什么问题或限制呢? 在嵌套存储过程中,调用的是外层存 ...
- 浅谈Webpack模块打包工具四
Webpack 生产环境优化 生产环境和开发环境有很大的差异,生产环境只注重运行效率,开发环境主要开发效率,webpack4.0开始提出了(mode)模式的概念 针对不同的环境进行不同的配置,为不同的 ...
- 网络之一次http请求的完整过程
关于网络的知识平时可能真正用的比较少,但是有一些点还是需要总结的: 完成一次http请求要大致可以分为7个步骤: 一.TCP三次握手 第一次握手:建立连接.客户端发送连接请求报文段,将SYN位置为1, ...
- Ansible主机清单Inventory文件hosts
Ansible主机清单Inventory文件hosts 发表于 2017-05-14 | 分类于 运维相关 , Ansible | | 阅读次数 4638 | 字数统计 1,442 | 阅读时长预计 ...
- Leetcode(28)-实现strStr()
实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...
- CN_Week2_Neuron_code
CN_Week1_Neuron_code on Coursera Abstract for week2: -- 1. Technique for recording from the brain. - ...