關於js中call apply bind方法的區別

2021-07-24 04:48:13 字數 1598 閱讀 7087

簡單來講,這三個函式存在的意義是改變函式執行時的上下文, 說的再具體一點就是改變函式執行時的this指向

例如

function

person

(name)

person.prototype =

};var person = new person('duo');

person.showname();

上面的**中person呼叫showname方法後會在瀏覽器的控制台輸出duo

然後

ar animal =
// 1

call

person.showname

.call(animal);

person.showname

// 3 bind

person.showname

.bind(animal)();

很神奇,控制台輸出了三次cat

我們拿別人的showname方法,並動態改變其上下文幫自己輸出了資訊,說到底就是實現了復用

上面看起來三個函式的作用差不多,幹的事幾乎是一樣的,那為什麼要存在3個傢伙呢,留乙個不就可以。所以其實他們幹的事從本質上講都是一樣的動態的改變this上下文,但是多少還是有一些差別的…

fn.call(obj, arg1, arg2, arg3...);
var arr = [34,5,3,6,54,6,-67,5,7,6,-8,687];

math.max.call(math, 34,5,3,6,54,6,-67,5,7,6,-8,687);

math.min.call(math, 34,5,3,6,54,6,-67,5,7,6,-8,687);

var arraylike =
上面就是乙個普通的物件字面量,怎麼把它變成乙個陣列呢?最簡單的方法就是

var arr = array.prototype

.slice

.call(arraylike);

上面arr便是乙個包含arraylike元素的真正的陣列啦(注意資料結構必須是以數字為下標而且一定要有length屬性)

在js中要往陣列中新增元素,可以直接用push方法

var arr1 = [1,2,3];

var arr2 = [4,5,6];

// arr1 [1, 2, 3, 4, 5, 6]

// arr2 [4,5,6]

對於物件型的資料型別,我們可以借助call來得知他的具體型別,例如陣列

function

isarray

(obj)

isarray() // true

isarray('duo') // false

js中關於時間

1 獲取當前時間 var mydate new date mydate.getyear 獲取當前年份 2位 mydate.getfullyear 獲取完整的年份 4位,1970 mydate.getmonth 獲取當前月份 0 11,0代表1月 mydate.getdate 獲取當前日 1 31 m...

關於js中的then

then 相關的東西包括但不限於 promise,thien.js 雖然還沒徹底搞清楚這些個玩意兒,但是 現在知道了 then 是幹嘛的了 最主要的,是解決了非同步方法立刻返回的問題 這個特性帶來的後遺症 假設 我要等非同步處理完了,再去執行一段 後續 怎麼做?定義乙個全域性flag,非同步處理完成...

關於 js 中 this 的理解

今天在寫乙個tab選項卡切換時遇到乙個 this 的引用問題,做個記錄加深一下理解。定時器 var timer null var lis document.getelementsbytagname li for var i 0 i 給每個li元素新增自定義屬性id,值為當前li元素在lis中的索引 ...