JavaScriptでは、次の2つの方法で関数を呼び出すことができます。
function f(message) { ... }
f.call(this, "test");
あるいは単に:
f("test")
最初のケースでスコープを指定できることを除いて、この構文を他の構文よりも使用することに他の利点はありますか?
JavaScriptでは、次の2つの方法で関数を呼び出すことができます。
function f(message) { ... }
f.call(this, "test");
あるいは単に:
f("test")
最初のケースでスコープを指定できることを除いて、この構文を他の構文よりも使用することに他の利点はありますか?
this
必要に応じてオブジェクトを渡すことができます。例えば
[].slice.call("abcdef", 2) === ['c', 'd', 'e', 'f'];
また
var x = {hasOwnProperty:function() { return false; }, key:42};
x.hasOwnProperty('key'); // == false
{}.hasOwnProperty.call(x, 'key'); // true
call
これはキーワードではなく、のメソッドであることに注意してくださいFunction.prototype
。
読む:
最初のケースでスコープを指定できることを除いて
「スコープを指定」することはできません。スコープはコードの記述方法によって設定されます。を使用して、限られた範囲以外で動的に変更することはできませんwith
。関数のthis
キーワードはスコープとは関係がなく、現在の実行コンテキストでは常にローカル変数として解決されます。
部分関数アプリケーションcall
に(およびapply
)を使用することもできます。これは、いくつかの事前設定された引数を使用して別の関数を呼び出す関数を作成する場合です。例えば:
// Basic add function
function add(a, b) {
return a + b;
}
// Function to create new adders with a preset 'a' argument
function createAdder(a) {
return function(b) {
return add.call(null, a, b);
}
}
// Let's create a function that always adds five to what's passed in
var addFive = createAdder(5);
// Now let's test it
addFive(6); // 11 - it works!