欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中的apply和call函數(shù)詳解

 更新時間:2014年07月20日 17:00:47   投稿:hebedich  
本文是翻譯Function.apply and Function.call in JavaScript,希望對大家有所幫助

第一次翻譯技術文章,見笑了!

翻譯原文:

Function.apply and Function.call in JavaScript

第一段略。

每個JavaScript函數(shù)都會有很多附屬的(attached)方法,包括toString()、call()以及apply()。聽起來,你是否會感到奇怪,一個函數(shù)可能會有屬于它自己的方法,但是記住,JavaScript中的每個函數(shù)都是一個對象??匆幌?這篇文章 ,復習一下(refresher)JavaScript特性。你可能還想知道JavaScript中函數(shù)和方法的區(qū)別。我認為“函數(shù)”和“方法”的描述,僅僅是JavaScript的習慣約定而已。函數(shù)立足于它們自己(例如:alert()),而方法是函數(shù)內(nèi)部一個對象的屬性(dictionary),我們通過對象來調(diào)用方法。每個JavaScript對象都有一個toString()方法,下面通過代碼舉例說明,在一個函數(shù)對象中,我們可以使用toString()方法。

function foo(){
 alert('x');
}
alert(foo.toString());

因為函數(shù)都是對象,它們有自己的屬性和方法。我們可以把它們看作數(shù)據(jù)(data)。這篇文章,我們只關注兩個函數(shù)的方法apply()以及call()。

我們從下面的代碼開始:

var x = 10;
function f(){
 alert(this.x);
}
f();

我們定義了一個全局函數(shù)f()。f()通過this關鍵字訪問變量x,但是需要注意的是,我們不能通過一個對象的實例來調(diào)用這個函數(shù)。this指向的是什么對象呢?this會指向這個全局對象。我們的變量x就是在這個全局對象中定義的。上面的代碼能夠正常運行,運行結果會顯示一個對話框,對話框中顯示10。

我們可以通過this來調(diào)用call()和apply()。正如下面的例子展示如何使用call():

var x = 10;
var o = { x : 15};
function f(){
 alert(this.x);
}
f();
f.call(o);

首先調(diào)用f()將會顯示10的對話框,因為this這個時候指向的是全局對象。然后我們調(diào)用f函數(shù)的call()方法,傳入的參數(shù)是o,運行結果顯示的是o中x屬性的值15。call()方法會用它的第一個參數(shù)作為f函數(shù)的this指針。也就是說,我們會告訴運行時,f函數(shù)中的this指向的是哪個對象。

this跳轉(zhuǎn)聽起來有些滑稽,甚至對于C++、Java以及C#程序員來說有些反常。這些都是ECMAScript中有趣的部分。

通過call()也可以給函數(shù)傳遞參數(shù):

var x = 10;
var o = { x : 15};
function f(){
 alert(this.x);
}
f();
f.call(o);

apply()和call()類似的,只是apply()要求第二個參數(shù)必須是一個數(shù)組。這個數(shù)組會作為參數(shù)傳遞給目標函數(shù)。

var x = 10;
var o = {x : 15};
function f(message) {
 alert(message);
 alert(this.x);
}
f('invoking f');
f.apply(o, ['invoking f through apply']);

apply()方法是很有用的,因為我們可以創(chuàng)建一個函數(shù)而不用去關心目標方法的參數(shù)。這個函數(shù)可以通過apply()的第二個數(shù)組參數(shù)來傳遞額外的參數(shù)給方法。

var o = {x : 15};
function f1(message1) {
 alert(message1 + this.x);
}
function f2(message1, message2) {
 alert(message1 + (this.x * this.x) + message2);
}
function g(object, func, args) {
 func.apply(object, args);
}
g(o, f1, ['the value of x = ']);
g(o, f2, ['the value of x squared = ', '. Wow!']);

這樣的語法有點問題。為了調(diào)用apply()方法,我們強制目標函數(shù)使用數(shù)組中的參數(shù)。幸運的是,有一個方法可以讓這種語法更簡單。在此之前,我們必須先介紹一個:參數(shù)標識符。

在JavaScript中,其實每個函數(shù)都有一個可變長度的參數(shù)列表。這意味著,即使一個函數(shù)只有一個參數(shù)的時候,我們也可以傳遞5個參數(shù)給它。下面的代碼不會有錯誤,而且結果顯示的是“H”。

function f(message) {
 alert(message);
}
f('H', 'e', 'l', 'l', 'o');

在f()中,如果我們不想去接受其他的參數(shù),我們可以用關鍵字arguments。arguments代表一個參數(shù)對象,它有一個代表長度的屬性類似于數(shù)組。

function f(message) {
 // message的值和arguments[0]是一樣的
 for(var i = 1; i < arguments.length; i++){
  message += arguments[i];
 }
 alert(message);
}
// 結果顯示“Hello”
f('H', 'e', 'l', 'l', 'o');

你應該知道,嚴格來講,arguments不是一個數(shù)組。arguments有一個length屬性,但是沒有split、push、pop方法。在前面的g()函數(shù)中,我們可以從arguments中拷貝需要的參數(shù),組成數(shù)組,然后把這個數(shù)組傳遞給apply()。

var o = {x : 15};
function f(message1, message2) {
 alert(message1 + ( this.x * this.x) + message2);
}
function g(object, func) {
 // arguments[0] = object
 // arguments[1] = func
 var args = [];
 for(var i = 2; i < arguments.length; i++) {
  args.push(arguments[i]);
 }
 func.apply(object, args);
}
g(o, f, 'The value of x squared = ', '. Wow!');

當我們調(diào)用g(),we can pass additional arguments as parameters instead of stuffing the arguments into an array。

相關文章

  • jQuery EasyUI之驗證框validatebox實例詳解

    jQuery EasyUI之驗證框validatebox實例詳解

    本文通過實例代碼給大家講解了jQuery EasyUI之驗證框validatebox知識,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-04-04
  • jquery實現(xiàn)多屏多圖焦點圖切換特效的方法

    jquery實現(xiàn)多屏多圖焦點圖切換特效的方法

    這篇文章主要介紹了jquery實現(xiàn)多屏多圖焦點圖切換特效的方法,涉及jQuery插件jquery.kinMaxShow實現(xiàn)焦點圖的相關技巧,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • jQuery實現(xiàn)模糊查詢的方法分析

    jQuery實現(xiàn)模糊查詢的方法分析

    這篇文章主要介紹了jQuery實現(xiàn)模糊查詢的方法,結合實例形式分析了jQuery事件響應、節(jié)點遍歷、查詢匹配、屬性修改等相關操作技巧,需要的朋友可以參考下
    2018-05-05
  • jQuery實現(xiàn)的簡單圖片輪播效果完整示例

    jQuery實現(xiàn)的簡單圖片輪播效果完整示例

    這篇文章主要介紹了jQuery實現(xiàn)的簡單圖片輪播效果,結合完整實例形式分析了jQuery結合時間函數(shù)與隨機數(shù)運算操作頁面元素動態(tài)變換相關實現(xiàn)技巧,具有不動方向滑動、淡入淡出等切換效果,代碼非常簡單實用,需要的朋友可以參考下
    2018-02-02
  • jQuery使用append在html元素后同時添加多項內(nèi)容的方法

    jQuery使用append在html元素后同時添加多項內(nèi)容的方法

    這篇文章主要介紹了jQuery使用append在html元素后同時添加多項內(nèi)容的方法,實例分析了jQuery中append追加內(nèi)容的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • jQuery中實現(xiàn)text()的方法

    jQuery中實現(xiàn)text()的方法

    這篇文章主要介紹了jQuery中實現(xiàn)text()的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • jQuery中parents()的使用說明

    jQuery中parents()的使用說明

    今天遇到一個有意思的問題,jquery有兩個函數(shù)parent()和parents().通過這兩個函數(shù)可以找到一個對象的父對象,又稱作jquery的選擇器。
    2010-11-11
  • jQuery表單校驗插件validator使用方法詳解

    jQuery表單校驗插件validator使用方法詳解

    這篇文章主要為大家詳細介紹了jQuery表單校驗插件validator的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • jquery入門必備的基本認識及實例(整理)

    jquery入門必備的基本認識及實例(整理)

    本文整理了一些jquery入門必備的基本知識及相關實例,適合初學者學習,另附一些jquery的常用事件,感興趣的各位可不要錯過了哈
    2013-06-06
  • Jquery使用AJAX方法請求數(shù)據(jù)

    Jquery使用AJAX方法請求數(shù)據(jù)

    本文詳細講解了Jquery使用AJAX方法請求數(shù)據(jù),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論