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

浙公网安备 33010602011771号