為什么需要這些晦墙?主要是因為this稿蹲,來看看this干的好事沧奴。
box.onclick = function(){
????????function fn(){ ? ? ? ?alert(this);? ? ? ? }
fn();
};
我們原本以為這里面的this指向的是box,然而卻是Window邑蒋。一般我們這樣解決:
box.onclick = function(){
var _this = this;
functionfn(){ alert(_this); }
fn();
};
將this保存下來奕污。
還有一些情況萎羔,有時我們想讓偽數(shù)組也能夠調(diào)用數(shù)組的一些方法,這時call碳默、apply贾陷、bind就派上用場了。?
我們先來解決第一個問題修復this指向嘱根。
box.onclick = function(){
function fn(){ console.log(this);}
????fn.call(this);
};
很神奇吧髓废,call的作用就是改變this的指向的,第一個傳的是一個對象该抒,就是你要借用的那個對象慌洪。
fn.call(this);?
這里的意思是讓this去調(diào)用fn這個函數(shù),這里的this是box凑保,這個沒有意見吧冈爹?如果這個你不清楚,很可能你是javscript的新朋友欧引。box調(diào)用fn频伤,這句話非常重要,我們知道this它始終指向一個對象芝此,剛好box就是一個對象憋肖。那么fn里面的this就是box因痛。
這句話在某些情況下是可以簡寫的,比如:
box.onclick = function(){
var fn = function(){ console.log(this); //box }.call(this);
};
或者這樣:
box.onclick = function(){
(function(){
console.log(this);
}.call(this)); //box};
又或者這樣:
var objName = {name:'JS2016'};
var obj = {
name:'0 _ 0',
sayHello:function(){
???? console.log(this.name);
}.bind(objName)
};
obj.sayHello();//JS2016
call和apply瞬哼、bind都是用來改變this的指向的婚肆,但也有一些小小的差別。下面我們來看看它們的差別在哪
function fn(a,b,c,d){
console.log(a,b,c,d);
}
//call
fn.call(null,1,2,3);
//apply
fn.apply(null,[1,2,3]);
//bind
var f = fn.bind(null,1,2,3);
f(4);
結果如下:1 2 3 undefined1 2 3 undefined1 2 3 4
前面說過第一個參數(shù)傳的是一個你要借用的對象坐慰,但這么我們不需要较性,所有就傳了一個null,當然你也可以傳其他的结胀,反正在這里沒有用到赞咙,除了第一個參數(shù)后面的參數(shù)將作為實際參數(shù)傳入到函數(shù)中。
call就是挨個傳值糟港,apply傳一個數(shù)組攀操,bind也是挨個傳值,但和call和apply還有一些不同秸抚,使用call和apply會直接執(zhí)行這個函數(shù)速和,而bind并不直接執(zhí)行,而是將綁定好的this重新返回一個新函數(shù)剥汤,什么時候調(diào)用由你自己決定颠放。
var objName = {name:'JS2016'};var obj = {
name:'0 _ 0',
sayHello:????function(){
????????console.log(this.name);
}.bind(objName)
};
obj.sayHello();//JS2016
這里也就是為什么我要用bind的原因,如果用call的話就會報錯了吭敢。自己想想這個sayHello在obj都已經(jīng)執(zhí)行完了碰凶,就根本沒有sayHello這個函數(shù)了。
這幾個方法使用的好的話可以幫你解決不少問題比如:?
正常情況下Math.max只能這樣用
Math.max(10,6)
但如果你想傳一個數(shù)組的話你可以用apply
var arr = [1,2,30,4,5];
console.log(Math.max.apply(null,arr));
又或者你想讓偽數(shù)組調(diào)用數(shù)組的方法
function fn(){
[].push.call(arguments,3);
console.log(arguments); //[1, 2, 3]
}
fn(1,2);
再者:
var arr = ['aaabc'];
console.log(''.indexOf.call(arr,'b')); //3
實際上瀏覽器內(nèi)部根本就不在乎你是誰鹿驼,它只關心你傳給我的是不是我能夠運行的欲低,如下:?
正常情況
var str = 'aaabc';
console.log(str.indexOf('b'));
而這種情況其實做的事情和上面一模一樣,看我來拆解畜晰。
var arr = ['aaabc'];
' '.indexOf.call(arr);
這句話就是說讓arr調(diào)用字符串的indexOf方法砾莱,前面說過了瀏覽器內(nèi)部不在乎你是誰,所以誰都可以來調(diào)用凄鼻,但不是100%成功恤磷,具體看如下。
''.indexOf.call(arr,'b')
這里的arr就是[‘a(chǎn)aabc’]野宜,內(nèi)部很可能拆成了’aaabc’扫步,因此就成了下面的這段代碼。
'aaabc'.indexOf('b');
鏈接:http://blog.csdn.net/lizeshi125/article/details/53670590