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);
    

      

  • 相关阅读:
    949. Largest Time for Given Digits
    450. Delete Node in a BST
    983. Minimum Cost For Tickets
    16. 3Sum Closest java solutions
    73. Set Matrix Zeroes java solutions
    347. Top K Frequent Elements java solutions
    215. Kth Largest Element in an Array java solutions
    75. Sort Colors java solutions
    38. Count and Say java solutions
    371. Sum of Two Integers java solutions
  • 原文地址:https://www.cnblogs.com/yaochc/p/7663515.html
Copyright © 2011-2022 走看看