1.函數模式
this指向window全局對象
2.方法模式
this指向調用這個方法的對象
3.構造函數模式
this 使用new創建出來的對象
4.上下文模式
this指向window全局對象
在上下文調用模式中,可以修改this的值,也就是可以修改函數的調用方式
使用如下兩個方法,可以修改函數調用上下文,也就是this的值
apply
api文檔中的語法語句中 [] 代表括起來的東西可有可無
函數.apply(對象, 函數需要參數列表,是一個數組)
call
函數.call(對象,arg1,arg2,arg3...argn)
call和apply的區別
1.第一個參數都是要把this修改成的對象
2.當函數需要參數的時候,那麼apply是用數組進行參數的傳遞
3.而call是使用單個的參數進行傳遞
call用於確定了函數的形參有多少個的時候使用
apply用於函數的形參個數不確定的情況
//案例:求一個數組中的最大值
var arr = [9, 1, 4, 10, 7, 22, 8];
//apply方法的第二個參數 是一個數組
// 在調用的時候,會將數組中的每一個元素拿出來,作爲形參,挨個傳遞給函數
//apply方法和call方法第一個參數傳遞null的時候,都表示爲函數調用模式
//也就是將this指向window
var max = Math.max.apply(null, arr);
console.log(max);
//案例:將傳入的參數打印,參數之間用-相互連接
function foo() {
//僞數組不具有join方法,所以這個時候就要考慮去借用一下數組的join方法
var str = [].join.apply(arguments,["-"]);
return str;
}
var str = foo(1, 3, "abc", "ffff", 99) // 1-3-abc-ffff-99
console.log(str);
fun.call(null)===fun.call(window);
在全局對象訪問一個未定義變量會報錯
用對象訪問一個未定義的變量返回undifined
arr.push(arr1):會把整個數組arr傳進去
arr.push.apply(arr,arr1):會把arr1拆開再傳進去
使用call和apply會將傳入的第一個參數爲值類型的對象轉換成引用類型,檔位null或者undefined