2011-11-28 121 views
1

我正在學習apply,我想了解爲什麼我正在學習的代碼只傳遞一個參數來應用。爲什麼在這種情況下只適用一個參數?

我首先定義現狀:

var Quo = function(string) { 
    this.status = string; 
}; 

接下來我定義GET_STATUS:

Quo.prototype.get_status = function() { 
    return this.status; 
}; 

我定義statusObject:

var statusObject = { 
    status: 'yo!' 
}; 

而這正是我迷失:

var status = Quo.prototype.get_status.apply(statusObject); 
// status is 'yo!' 

根據documentation「Apply調用具有給定此值和作爲數組提供的參數的函數」。你可以看到在這種情況下,使用apply我只傳遞一個參數,我相信這是定義「this」。你能清楚這個方法究竟發生了什麼,爲什麼應用是必要的,爲什麼在這種情況下,我只能通過一個參數的方法,當它聲明兩個是必要的。謝謝。

+1

'get_status'函數沒有必要的參數,所以不需要提供任何參數。如果他們被提供,他們就會被忽略。代碼可以很容易地使用'call'。 – zzzzBov

+0

'.apply'沒有必要,'.call'也會做同樣的事情。 '.apply'是將未知數量的參數傳遞給你不需要的函數的唯一方法。問題是什麼? :) – Esailija

回答

3

apply設置功能的情況下被應用於第一個參數中提供的對象。

var o; 
function baz(a, b, c) { 
    //do stuff 
} 

o = { 
    foo: 'bar' 
}; 

baz.apply(o); 
//this is o 
//a is undefined 
//b is undefined 
//c is undefined 

如果數組被作爲第二個參數傳遞,參數將被設置基於關閉數組中的值:

baz.apply(o, [1,2,3]); 

//this is o 
//a is 1 
//b is 2 
//c is 3 

apply第二個參數是可選的,然而call通常用於用於設置上下文:

//these do the same thing 
baz.call(o); 
baz.apply(o); 

//this is how they're different 
baz.call(o, 1, 2, 3); 
baz.apply(o, [1, 2, 3]); 
2

它並沒有說明需要兩個:

fun.apply(thisArg[, argsArray]) 

通知如何argsArray是在括號中,它是可選的。

通話中發生了什麼,是您的statusObject作爲this參數傳遞給您的get_status功能。

這意味着當get_status執行並確實return this.status它實質上返回statusObject.status

應用程序很有用,原因很多,其中之一是動態調用方法。我可以通過一個方法的字符串名稱的對象被調用,像這樣:

methods = { 
    init: function(message) { 
     alert(message); 
    } 
}; 
function executeFunc(method) { 
    methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
} 

//now I can call like this: 
executeFunc('init', 'Hey there, this is a message'); 

這樣的例子可以在我的jQuery插件骨架被發現GitHub

0

apply採用一個參數,該對象爲this使用,隨後噸他論證如果有的話

如果函數沒有參數,例如你有function f() { ... },你不需要傳遞任何參數,所以你可以撥打f.apply(someObject);

+0

它的JavaScript,你不*有*傳遞參數。只要你願意接受不傳遞給他們的後果:) – Chad

相關問題