闭包

下面这个方法能输入0 1 2 ... 9吗?显然是不可以的,输出结果是10个10。

function test()
{
var arr = [];
for(var i = 0; i < 10; i++)
{
arr[i] = function() {
console.log(i);
}
}
return arr;
}
var arrs = test();
for(var j = 0; j < arrs.length; j++) {
arrs[j]();
}

  利用立即执行函数把0到9输出。这种写法没什么意义,还不如直接写个for循环

function test()
{
var arr = [];
for(var i = 0; i < 10; i++)
{
(function()
{
console.log(i)
}(i))
}
}
var arrs = test();

  下面这种写法能看懂不,反正我是想不出来的

function test()
{
var arr = [];
for(var i = 0; i < 10; i++)
{
(function(j){
arr[j] = function() {
console.log(j);
}
}(i))
}
return arr;
}
var arrs = test();
for(var j = 0; j < arrs.length; j++) {
arrs[j]();
}

  闭包的应用3:可以实现封装,属性私有化

说明:prepareWife不属于Deng的属性,但是能够被方法访问。

//闭包的应用:可以实现封装,属性私有化
function Deng(name, wife) {
var prepareWife = "xiaozhang";
this.name = name;
this.wife = wife;
this.divorce = function() {
this.wife = prepareWife;
}
this.changePrepareWife = function (target) {
prepareWife = target;
}
this.sayPrepareWife = function() {
console.log(prepareWife);
}
}
var deng = new Deng('deng', 'xiaoliu');

  this指向

说明:结果是222,最后执行fun()没有对象调用所以是window的name.

var name = "222";
var a = {
name : "111",
say : function() {
console.log(this.name);
}
}
var b = {
name : "333",
say : function(fun) {
// this --> b
// fun没有对象调用,所以是window(GO)
fun();
}
}
b.say(a.say);//222
b.say = a.say;
b.say();//333 

  

  深度克隆

// 1.判断是不是原始值 typeof() object
// 2.判读是数组还是对象 instanceof toString constructor
// 3.建立相应的数组或对象(递归)
var obj = {
name : "abc",
age : 14,
card : ['visa', 'master'],
wife : {
name : "abcd",
son : {
name : "aaa"
}
}
}
var obj1 = {}
function deepClone(origin, target){
var target = target || {},
toStr = Object.prototype.toString,
arrStr = "[object Array]";
for(var prop in origin) {
if(origin.hasOwnProperty(prop)) {
if(typeof(origin[prop] == 'object')) {
if(toStr.call(origin[prop]) == arrStr){
target[prop] = [];
}else{
target[prop] = {};
} deepClone(origin[prop], target[prop]); }else{
target[prop] = origin[prop];
}
}
} }
deepClone(obj, obj1);

  

ECMAScript/JS 基础知识讲解的更多相关文章

  1. [JS复习] JS 基础知识

    项目结尾,空闲时间,又把<JS 基础知识> 这本书过了一遍,温故知新后,很多知其然不知其所以然的内容 豁然开朗. [1. 用于范围的标签] display  :inline or bloc ...

  2. Html基础知识讲解

    Html基础知识讲解 <title>淄博汉企</title> </head> <body bgcolor="#66FFCC" topmar ...

  3. HTML+CSS+JS基础知识

    HTML+CSS+JS基础知识 目录 对HTML+CSS+JS的理解 基础知识 对HTML+CSS+JS的理解 基础知识 插入样式表的三种方式 外部样式表:<link rel="sty ...

  4. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  5. Node.js基础知识

    Node.js入门   Node.js     Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始.比较独特的是,Node.js会假设在POSIX环境下运行 ...

  6. 网站开发进阶(十五)JS基础知识充电站

    JS基础知识充电站 1.javascript alert弹出对话框时确定和取消两个按钮返回值? 用的不是alert对话框,是confirm confirm(str); 参数str:你要说的话或问题: ...

  7. NodeJs>------->>第三章:Node.js基础知识

    第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info  方法 console.log(" node app1.js 1> ...

  8. java Reflection(反射)基础知识讲解

    原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...

  9. JS基础知识笔记

    2020-04-15 JS基础知识笔记 // new Boolean()传入的值与if判断一样 var test=new Boolean(); console.log(test); // false ...

随机推荐

  1. Python 3 初探,第 2 部分: 高级主题

    Python 3 是 Guido van Rossum 功能强大的通用编程语言的最新版本.它虽然打破了与 2.x 版本的向后兼容性,但却清理了某些语法方面的问题.本文是这个由两部分组成的系列文章中的第 ...

  2. python——二进制/十进制等转换

    To 十进制 八进制: >>> int('10', 8) ->8   To 十六进制: 十进制: >>> hex(12) ->‘0xc’ 二进制: &g ...

  3. iOS学习笔记-自定义过渡动画

    代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...

  4. oracle 创建一个用户,并且设定只能访问指定的对象

    出处:http://www.cnblogs.com/BetterWF/archive/2012/07/03/2574416.html 今天在开发接口时候,需要给接口开发公司提供一个ORACLE 用户, ...

  5. 纪念我人生中第一个merge into语句

    做按组织关系汇总功能时,当数据量特别大,或者汇总组织特别多时,运行效率特别低,于是使用了merge into语句. 代码如下: public void updateInsertData(DataSet ...

  6. 未能加载文件或程序集“WebGrease, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

    方法一:在web.config的configuration接点中添加,最好是添加在configuration节点的最后 <runtime> <assemblyBinding xmln ...

  7. ubuntu 环境变量PATH的修改

    sudo nano /etc/environment 环 境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell.对于Linux来说一般是bash,但也可以重新设定或切换到其它的 She ...

  8. bullet, iOS真机编译错误error: identifier or immediate expression expected解决方法

    刚才发现c3dEngine2(http://git.oschina.net/wantnon2/c3dEngine2 或 https://github.com/wantnon2/c3dEngine2)的 ...

  9. java设计模式 -------- 创建模式 之 抽象工厂模式

    本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...

  10. SQL注入-数据库判断

    0x01.sql注入 sql注入是在系统开发的过程中程序员编程不规范,我们可以通过把SQL语句插入到WEB表单中进行查询字符串,最终达成欺骗服务器执行恶意的SQL命令.对于现在的网站SQL注入越来越严 ...