1、函数预编译过程 this —> window
2、全局作用域里 this —> window
3、obj.func(); func()里面的this指向obj), 可以这样理解,谁调用func,则this就指向谁
4、call/apply 可以改变函数运行时this指向,
(1)、call用法:
func.call(要改变后的this, arg1, arg2, … );
(2)、apply用法:
func.apply(要改变后的this, [arg1, arg2, arg2]);
(3)、apply和call共同点:都是改变this指向
apply和call不同点:传参形式不同,call是将参数一个个传进来,而apply是将所有参数存进一个数组中,然后将该数组传
// demo1
function demo1() {
console.log(this);
}
// demo1() <==> this.demo1(); <==> window.demo1()
demo1(); // window
// demo2
var demo2 = {
retThis: function () {
console.log(this);
}
}
demo2.retThis(); // demo2 = {...}
// call / apply改变this
demo1.call(demo2); // demo2 = {}
demo2.retThis.call(window); // window
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// demo1
functiondemo1(){
console.log(this);
}
// demo1() <==> this.demo1(); <==> window.demo1()
demo1();// window
// demo2
vardemo2={
retThis:function(){
console.log(this);
}
}
demo2.retThis();// demo2 = {...}
// call / apply改变this
demo1.call(demo2);// demo2 = {}
demo2.retThis.call(window);// window
对象克隆,分为浅克隆和深克隆,而上边的直接赋值的克隆操作为浅克隆,为什么称为浅克隆呢?因为,克隆的和被克隆的对象在克隆操作完成后,指向同一个地址引用,改变其中一个(注意:此处的改变为增加或删除对象的属性,而不是为该对象重新赋值一个对象),另一个也会改变,而深克隆则不会产生此现象。
深克隆/深拷贝代码如下:
// 对象的深度克隆(Array / obj /...)
function deepClone(obj) {
var str, retObj = Object.prototype.toString.call(obj) === '[object Array]' ? [] : {};
if(typeof obj !== 'object') {
return;
}else if(window.JSON) {
str = JSON.stringify(obj);
retObj = JSON.parse(str);
}
else {
for(var prop in obj) {
retObj[prop] = typeof obj[prop] === 'object' ? deepClone(obj[prop]) : obj[prop];
}
}
return retObj;
}
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 对象的深度克隆(Array / obj /...)
functiondeepClone(obj){
varstr,retObj=Object.prototype.toString.call(obj)==='[object Array]'?[]:{};
if(typeofobj!=='object'){
return;
}elseif(window.JSON){
str=JSON.stringify(obj);
retObj=JSON.parse(str);
}
else{
for(varpropinobj){
retObj[prop]=typeofobj[prop]==='object'?deepClone(obj[prop]):obj[prop];
}
}
returnretObj;
}
https://www.cnblogs.com/libin-1/p/5911190.html