首頁 >web前端 >js教程 >javascript中call apply 的應用場景_javascript技巧

javascript中call apply 的應用場景_javascript技巧

WBOY
WBOY原創
2016-05-16 16:03:431128瀏覽

在一些jQuery插件中經常看到類似callback.call(xxx,xxx) 雖然看到書上有介紹說call和apply函數可以改變作用域,但還是無法非常透徹的理解改變作用域主要是為了要解決什麼問題,有沒有替代方案,或者這2個函數主要為了解決什麼問題,應用場景,何時使用最合適,每次讀到這樣的程式碼就暈了,一下子從線性閱讀中跳出去了,感覺有點繞

call和apply的作用很簡單,就是改變上下文,適用場景太多了,雖然有時候只是為了“美觀”,下面幾個是我常用的。

1.

複製程式碼 程式碼如下:
Object.prototype.toString.call(Obj)
Object.prototype.toString.call(Obj)

用來判斷 Obj 的型別


arguments 雖然和Array 很像,但是他沒有Array的push之類的方法,怎麼辦?

Array.prototype.push.call(arguments)

3.Javascript 沒有私有方法的概念,想用閉包實作
(function () {
  var Person = function () {
    this.doSomeThing = function () {
      _privateFunction.call(this);
    }
  }

  var _privateFunction = function () {

  }

  window.Person = Person;

}).call(window);

差不多就是這個意思,callback的時候,當你希望你的callback中的上下文是當前上下文的時候,也可以用call或者apply,有什麼好處呢?

這時候你的callback 裡面的this 就是指涉當前上下文。例如一個類別Person,然後他的方法say 有一個callback的參數,如果這個callback是透過普通的括號來執行的話,那在這個callback裡面執行person的其它方法還需要用person.other 來實現,但是切換上下文之後,就是this.other搞定~程式碼對比如下:
var Person = function(){

};

Person.prototype.say = function(callback){
  callback();
};

Person.prototype.other = function(){

};

var vincent = new Person();

vincent.say(function(){
  vincent.other();
});

用了call的:
var Person = function(){

};

Person.prototype.say = function(callback){
  callback.call(this);
};

Person.prototype.other = function(){

};

var vincent = new Person();

vincent.say(function(){
  this.other();
});

以上所述就是本文的全部內容了,希望大家能夠喜歡。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn