在 javascript 中,call 和 apply 都是為了改變某個函數運行時的上下文(context)而存在的,換句話說,就是為了改變函數體內部 this 的指向。
JavaScript 的一大特點是,函數存在「定義時上下文」和「運行時上下文」以及「上下文是可以改變的」。
apply(): 將函數作為指定對象的方法來調用,傳遞給它的是指定的參數數組
function.apply(thisobj, args) 或者 function.apply(thisobj, args)
function.apply(thisobj, args) 或者 function.apply(thisobj, args)
1、thisobj是調用function的對象,函數體內thisobj為this,如果參數為null則使用全局對象
2、返回調用函數function的返回值
語法 fun.bind(thisArg[, arg1[, arg2[, ...]]])
function.bind(A) 或者是function.bind(A, args...);
1、A要綁定在函數上的對象
2、args...要綁定在函數上的零個或者是多個函數值
3、返回一個新函數,該函數會當做A的方法調用,並向它傳入args參數
bind是ES5新增的一個方法
傳參和call或apply類似
不會執行對應的函數,call或apply會自動執行對應的函數
返回對函數的引用
function.call(thisobj, args.....)
1、thisobj是調用function的對象,函數體內thisobj為this,如果參數為null則使用全局對象
2、返回調用函數function的返回值
apply與call的區別:
<script>
function print(a,b,c,d){ alert(a + b + c + d); } function example(a,b,c,d){ //當參數很明確,一般使用call
print.call(this,a,b,c,d); //封裝成數組
print.apply(this,[a,b,c,d]) //javascript方法本身有的arguments數組,當參數不明確的時候可以用apply結合arguments
print.apply(this,arguments) } example("心","想","事","成") </script>
var func = function(arg1, arg2) { }; 就可以通過如下方式來調用: func.call(this, arg1, arg2); func.apply(this, [arg1, arg2])
三者區別demo:
<script type="text/javascript">
var obj = { num: 888, }; var foo = { getNum: function() { return this.num; } } console.log(foo.getNum.bind(obj)()); //888
console.log(foo.getNum.call(obj)); //888
console.log(foo.getNum.apply(obj)); //888
//apply 、 call 、bind 三者都是用來改變函數的this對象的指向的;
//apply 、 call 、bind 三者第一個參數都是this要指向的對象,也就是想指定的上下文;
//apply 、 call 、bind 三者都可以利用后續參數傳參;
//bind 是返回對應函數,便於稍后調用;apply 、call 則是立即調用 。
</script>