var x=0;
var foo={
x=1,
bar:function(){
console.log(this.x);//this指foo
var that=this;//this指foo
return function(){
console.log(this.x);//this指的是wondow,相当于是匿名函数自调
console.log(that.x);
}
}
}
foo.bar();//调用bar,函数不调用不执行,this指向的是foo,输出1
foo.bar()();//1 0 1
<h4>函数不调用不执行</h4>
<script>
function fun(){
for(var i=0,arr=[];i<3;i++){
arr[i]=function(){
console.log(i)
}
}
return arr;
}
var funs=fun();//调用fun()
funs[0]();//3
funs[1]();//3
funs[2]();//3
//第一步运行函数后,循环for,结果返回的arr
//arr[0]=function(){console.log(i)}
//arr[1]=function(){console.log(i)}
//arr[2]=function(){console.log(i)}运行三次的结果
//arr=[function(){console.log(i)},function(){console.log(i)},function(){console.log(i)}]
//执行funs=fun()相当于是funs=arr
//因此funs[0]()等于是调用arr[0]的这个函数
//此时调用进行执行,i=3;因此执行后,得3
function fun(n,o){
console.log(o);
return {
fun:function(m){
return fun(m,n)
}
}
}
var a=fun(0);//console.log()结果是undefined,a={fun:function(m){
//return fun(m,n)}并且也运行了n=0;在a中有效
a.fun(1);//0,n=1,但是没有变量接,释放了,a中依旧是0
a.fun(2);//0,n=2,但是没有变量接,释放了,a中依旧是0
a.fun(3);//0,n=3,但是没有变量接,释放了,a中依旧是0
var b=fun(0)//undefined
.fun(1)//0
.fun(2)//1
.fun(3); //2
var c=fun(0).fun(1);//undefined 0
c.fun(2);//1
c.fun(3);//1
//判断以上结果,主要是看前一个结果是否被接住
var a=2;
var obj={
a:4,
fn1:(function(){
this.a*=2;
var a=3;
return function(){
this.a*=2;
a*=3;
console.log(a);
}
})
}
var fn1=obj.fn1;//函数不调用不执行
console.log(a);//2,函数不调用不执行,所以没有发生任何改变
fn1();//function(){}//此处运行后改变了window的a的值
obj.fn1();//此处改变的是obj的值
console.log(a);//4
console.log(obj.a);//8
let a=3;
let b=new Number(3);
let c=3;
console.log(a==b);//true 比较的是数值
console.log(a===b);//false 比较的是数值和类型
console.log(c===b);//false 比较的是数值和类型
var lilei={
sname:"Li Lei",
sage:11,
address:{
city:"北京",
street: "万寿路"
}
}
function clone(oldObj){
//在此填写作业代码,实现下方代码的要求
var newobj={};
for(var i in oldObj){
if(typeof oldObj[i]=='object'){//此处判断类型
console.log(oldObj[i])
newobj[i]=clone(oldObj[i]);//如果是对象的话,再次调用clone函数,得的结果仍然需要变量去接,不接的话就会释放
}else{newobj[i]=oldObj[i]};
}
return newobj;
}
var lilei2=clone(lilei);
console.log(lilei)
console.log(lilei2)//两个对象内容相同
console.log(lilei==lilei2)//false,说明不是同一个对象
//进一步: 修改lilei2
lilei2.address.city="石家庄"
lilei2.address.street="中山路"
console.log(lilei);//lilei.address不受影响,保持不变,依然是北京万寿路。
console.log(lilei2);
二维数组降维
var arr=[1,2,3,[5,6],7,8,[9,5]]
var arr=[].concat(...arr)
//...arr先将数组打散成1 2 3 (2) [5, 6] 7 8 (2) [9, 5]
//然后再拼接到[]中形成arr
console.log(arr)
多维数组降维
var arr=[1,2,3,[4,5],6,8,[9,4]];
var arr=[].concat(...arr);//先将数组用...arr打散数组,然后使用concat拼接到[]中
console.log(arr);
//多维数组降维
function fun(arr){
//先降一次维
arr=[].concat(...arr);
//再检查降维后的数组中是否还包含子数组
var hasArray=arr.some(function(elem){//some(function(){return 条件})用于判断是否包含符合条件的元素
console.log(Array.isArray(elem));
return Array.isArray(elem);
// console.log(hasArray)
})
if(hasArray){ //如果包含子数组
arr=fun(arr);//就只能再降维一次,直到检查不再包含子数组为止
}
return arr
}
console.log(fun(arr))
var name = 'jerry';
function Person(name){
var name = 'haha'; //重新声明赋值了成haha,所以不管传什么值最好的结果都是haha
this.name = name;0//person.name
}
Person.prototype.getName=function(){
return this.name;
}
Person.prototype.name='tomm';
var p1 = new Person();
var p2 = new Person('kite');
console.log(p1.getName()); //haha
console.log(p1.name); //haha
console.log(p2.name); //haha
console.log(p1); //person:{}
console.log(p2);//person:{}