2013-05-30 103 views
1

我碰到一個情況,我需要調用與.CALL()或。適用(函數)是這樣的:使用.call()/。apply()時函數參數在哪裏?

function b() { 
    alert(arg); 
} 

然後

function a(arg) { 
    b.call(); 
} 
a(123); 

功能B稱爲,但犯規」有權訪問arg。沒關係,我可以通過範圍..是嗎?

function a(arg) { 
    b.call(this); 
} 
a(123); 

仍然沒有 - 我不能訪問從函數b ARG。我該怎麼做?

UPDATE: 我不想修改B功能:-)

+0

可能重複的[呼叫和應用程序之間有什麼區別?](http://stackoverflow.com/questions/1986896/what-is-the-difference-between-call-and-apply) – meagar

+0

在去任何地方,你的第一行應該是這樣的:function b(arg){ – joeytwiddle

+0

@meagar我不是要求區別.. –

回答

6

您仍然需要通過call(單獨)或apply(來傳遞參數作爲一個陣列):

function a(arg1, arg2, arg3) { 
    b.call(this, arg1, arg2, arg3); 
    // or 
    b.apply(this, arguments) 
    // or 
    b.apply(this, [arg1, arg2, arg3]); 
} 

當然,沒有任何關於你的情況建議通過使用callapply:只需調用自己的函數。

function a(arg) { 
    b(arg); 
} 
+0

是的,論據是! :) –

1

試試這個:

function a(arg) { 
    b.apply(this, [arg]); 
    // or 
    // b.call(this, arg); 
} 

function b() { 
    alert(arguments); 
} 
3

這是不可能「通過範圍」或類似的東西。函數的作用域是在創建函數時確定的,因此只有在存在b的地方纔能訪問arg

如果arg是的this一部分,那麼你可以使用call做到這一點,即使在b相同thisthis因爲它是在a(當然這會修改任何this實際上指的是,這可能有副作用你可能不想發生)。

function a (arg) { 
    this.arg = arg; 
    b.call(this); 
} 

function b() { 
    console.log(this.arg); 
} 

另一種方法是將參數作爲實際函數參數傳遞給b。您可以訪問使用arguments函數的所有參數:

function b() { 
    console.log(arguments); 
} 
0

我想問題出在B()。沒有定義「arg」參數。嘗試:
function b(arg) { alert(arg); }

function a(arg) { 
    b.call(this,arg); 
} 
a(123); 

現在它運行

(更新:調用需要的參數(背景functionarg1,functionarg2 ...))

+0

你固定b,但不是! – joeytwiddle

+1

添加上下文「this」後調用()它運行;-) – dsuess

+0

對不起,根據更新我真的不想修改功能b :) –

-2

假設,因爲某些原因,你不能修改的b身體,你可以嘗試這樣的事:

function a(arg) { 
    eval("("+ b.toString() +")()"); 
} 

DEMO

+0

我希望沒有人想要這個。 – poke

+0

我希望有人會解釋爲什麼我應該假設* arg *和* arguments *對於OP來說是一回事。 – Engineer

+0

他們不一樣,OP並不意味着(我懷疑OP甚至知道'arguments')。雖然你的代碼完成了OP所需的任務(在'arg'可用的範圍內評估'b''''''''','eval'不應該是一個選項。 – poke

0

你沒有傳遞參數,當你叫b

Function::call允許傳遞的參數的固定數量:

function a(arg1,arg2) { 
    return b.call(this,arg1,arg2); 
} 

Function::apply允許傳遞任何數量的參數,作爲數組:

function a(arg1,arg2) { 
    return b.apply(this,[arg1,arg2]); 
} 

// or 

function a(arg1,arg2) { 
    return b.apply(this,arguments); // The magical 'arguments' variable 
} 

this是上下文對象,以及與範圍不是一回事。