1 call
obj.call(改變this指向的對象,參數(shù)1斗这,參數(shù)3) 參數(shù)可選
1.1 call 第一可調(diào)用函數(shù) 第二可以改變函數(shù)的this指向
1.2 call 的主要作用他可以實現(xiàn)繼承
<script>
var o = {
name:'andy'
}
function fn(a,b){
console.log(this);
console.log(a+b);
}
fn.call(o,1,2)
</script> 繼承
function Father(user,age,sex){
this.user=user;
this.age=age;
this.sex= sex;
}
function Son(uset,age,sex){
Father.call(this,uset,age,sex);
}
var son =new Son('123',18,'nan')
apply
fun.apply(thisArg,[argsArray]);
thisArg:在fun函數(shù)運行時指定的this
artgsArray:船體的值,必須要包含在數(shù)據(jù)里
返回值就是函數(shù)的返回值啤斗,應為它要調(diào)用函數(shù)。
<script>
var o = {
name:'ssss'
}
function fn (arr){
console.log(this);
console.log('------');
console.log(arr);
}
//1.這里改變函數(shù)內(nèi)部this 的指向赁咙,同時調(diào)用函數(shù)
//2.參數(shù)必須是數(shù)組格式钮莲。
fn.apply(o,['1']);
// 3.apply的主要應用
var arr=[1,33,4,45,56,22,22];
var max = Math.max.apply(Math,arr);
console.log(max);
</script>
bind
bind()方法不會調(diào)用函數(shù),但是能改變函數(shù)內(nèi)部this指向彼水。
fun.bind(thisArg,arg1,arg2,...)
thisArg:在fun函數(shù)運行時指定的this
arg1,arg2 傳遞的其他參數(shù)
-
返回由指定的this之后初始化參數(shù)改造的原函數(shù)拷貝崔拥。
<script> var o ={ name:'name' } function fn (a,b){ console.log(this); console.log(a+b); } //這里返回的是改變 this后的新函數(shù) var f=fn.bind(o,1,2); // 調(diào)用函數(shù) f(); </script>
call apply bind 總結
- call apply 會調(diào)用函數(shù),并改變函數(shù)內(nèi)部this指向
- call apply 傳遞的參數(shù)不一樣凤覆,call 傳遞闡述arg1链瓦,arg2形式。apply必須是數(shù)組的形式盯桦。
3.bind 不會調(diào)用函數(shù)慈俯,可以變函數(shù)內(nèi)部的this指向。
主要應用
1.call 主要做繼承拥峦、
2.apply 經(jīng)常和數(shù)組相關贴膘,比如借助數(shù)學對象實現(xiàn)數(shù)組最大值,最小值略号。
3.bind 不調(diào)用 函數(shù)刑峡,但是還想改變this指向。比如改變定時器內(nèi)部的this 指向
嚴格模式
ES5在IE10 以上的版本才會被支持玄柠。
-
消除了javascript 語法的一些不合理突梦、不嚴謹之處,減少了一些怪異行為
2.消除了一些不安全的地方
3.提高變異效率
4.為未來語法的javascript 做好了鋪墊
嚴格模式的開啟
1.為腳本開啟嚴格模式
直接寫 'use strict'<script> 'use strict' // 下面的js diamante會嚴格執(zhí)行代碼 </script>
2 為函數(shù)開啟嚴格模式
在指定的函數(shù)中寫 ‘use strict’
<script>
function fn(){
'use strict'
}
function fun(){
}
</script>
3 嚴格模式的變化
1 . 變量 變量必要要先聲明后使用
2 . 不能刪除已經(jīng)申明好的變量羽利。
3 . 以前全局作用下this 指向的是window 宫患,在嚴格模式下執(zhí)行的undefined。
4 . 以前構造函數(shù)不加new 可以直接調(diào)用铐伴,在嚴格模式下必須要new一下撮奏。
5.定時器this 還是指向window
6.事件、對象還是指向調(diào)用者当宴。
嚴格模式下函數(shù)變化
1 . 不能定義相同的形參畜吊。
2 . 函數(shù)必須聲明在頂層。
高階函數(shù)
高階函數(shù)是對其他函數(shù)進行操作的函數(shù)户矢。它接收函數(shù)作為參數(shù)或?qū)⒑瘮?shù)作為返回值輸出玲献。
下面就是將函數(shù)作為參數(shù)
<script>
function fn(callBack){\
callBack&&callBack();
}
</script>
fn(function(){
alert{'hi'};
}
閉包
閉包:指有權訪問另一個函數(shù)作用域中變量的函數(shù)。
閉包的作用:延伸了變量的作用范圍。
下面代碼在fun函數(shù)中訪問了fn函數(shù)中的變量num fn 函數(shù)就是閉包捌年。
<script>
function fn(){
var num =10;
function fun(){
console.log(num);
}
fun();
}
fn();
</script>
淺拷貝和深拷貝
淺拷貝只拷貝一層瓢娜,更深層次對象級別的只拷貝引用】
-
深拷貝是多層的,每一層都會拷貝
3.在ES6中可以直接使用Object.assign淺拷貝(要拷貝成的對象礼预,拷貝的對象)Object.assign(o,obj);
深拷貝
<script>
var obj = {
id:1,
age:2,
msg:{
name1:1,
sex:2
},
color:[1,3,56]
}
var o ={}
// for(var k in obj){
// o[k] = obj[k];
// }
function deepCopu(newObj,oldObj){
for(var k in oldObj){
var item = oldObj[k];
if(item instanceof Array){
// 這里要注意
newObj[k]={};
deepCopu(newObj[k],item);
}else if(item instanceof Object){
newObj[k]={};
deepCopu(newObj[k],item);
}else{
newObj[k]=item;
}
}
}
deepCopu(o,obj);