zoukankan      html  css  js  c++  java
  • ECMAScript/JS 基础知识讲解

    闭包

    下面这个方法能输入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);
    

      

  • 相关阅读:
    LINQ to SQL 运行时动态构建查询条件
    MVC ViewData和ViewBag
    下面介绍一下 Yii2.0 对数据库 查询的一些简单的操作
    php表单中如何获取单选按钮与复选按钮的值
    [moka同学摘录]Yii2.0开发初学者必看
    Yii路径总结
    css样式reset
    ajax onblur 用法
    jquery自定义插件——window的实现
    jQuery使用ajaxStart()和ajaxStop()方法
  • 原文地址:https://www.cnblogs.com/yaochc/p/7663515.html
Copyright © 2011-2022 走看看