js数据传递和闭包(学习笔记)

一、数据传递
1.传值和传址
    基本类型(undefined、null、字符串、布尔值、数字)的数据会传值赋值
    引用类型(对象)为传址赋值
 
var a={
    a1:"小明",
    a2:"小红"
};
//传址(浅拷贝,会影响到原对象的值)
var b = a;
//传值(深拷贝,不会影响原对象的值)
var c = {
    a1:a.a1,
    a2:a.a2
} 
b.a1 = '新浪';
c.a2 = '搜狐';
 
console.log(a.a1); //新浪
console.log(a.a2); //小红
console.log(b.a1); //新浪
console.log(b.a2); //小红
console.log(c.a1); //小明
console.log(c.a2); //搜狐
 
二、闭包:一个函数A中包含了另一个函数B,函数B中可以访问函数A中的变量,为嵌套关系
 
闭包的优点及缺点:延长作用域链,缓存数据(缓存数据的,这个也是缺点)
 
(----能访问局部变量的函数----)
 
var lis=document.getElementsByTagName("li");
for(var i=0;i<lis.length;i++){
    lis[i].index = i;//解决方案1:传统
    lis[i].onclick = function(){
        alert(lis[i].index);//for循环为预加载
    }
}
 
var lis=document.getElementsByTagName("li");
for(var i=0;i<lis.length;i++){
    //解决方案2:闭包(沙箱,函数自调用)
    (function(x){
        lis[x].onclick = function(){
            alert(x);
        }
    })( i );
}
 
闭包太浪费资源,要合理使用
 
var hd='阿里巴巴';
 
function foo(){
    var hd="新浪";
    function A(){
        console.log(hd);
    }
    return A;
}
 
var result = foo();
result();//新浪
 
function fun(n,o){
    console.log(o);
    return{
        fun:function(m){
            return fun(m,n);        
        }
    }
}
var a=fun(0);a.fun(1);a.fun(2);a.fun(3);//undefined,0,0,0
var b=fun(0).fun(1).fun(2).fun(3);//undefined,0,1,2
var c=fun(0).fun(1);c.fun(2);c.fun(3);//undefined,0,1,1
posted @ 2019-10-23 14:56  Katherine蓝羽  阅读(61)  评论(0)    收藏  举报