+1
その操作は実際にどの時点で発生しますか?
すべてのパラメーターは、関数に渡される直前に、左から右に評価されます。
プロダクションCallExpression:MemberExpression *引数*は次のように評価されます。
- MemberExpressionを評価した結果をrefとします。
- funcをGetValue(ref)とします。
- argListを引数の評価の結果とし、引数値の内部リストを生成します(11.2.4を参照)。
- Type(func)がObjectでない場合は、 TypeError例外をスローします。
- IsCallable(func)がfalseの場合、 TypeError例外をスローします。
- Type(ref)がReferenceの場合、
a。IsPropertyReference (ref)がtrueの場合、i
。thisValueをGetBase(ref)とします。
b。それ以外の場合、 refのベースはEnvironmentRecordiです
。thisValueを、 GetBase(ref )のImplicitThisValue具象メソッドを呼び出した結果とします。
- それ以外の場合、Type(ref)はReferenceではありません。
a。thisValueを未定義とします。
- funcで[[Call]]内部メソッドを呼び出した結果を返し、thisValueをthis値として提供し、リストargListを引数値として提供します。
引数リストを評価すると、値のリストが生成されます(8.8を参照)。
プロダクション引数:( )
は次のように評価されます:
- 空のリストを返します。
本番引数:(
ArgumentList )
は次のように評価されます。
- ArgumentListの評価結果を返します。
プロダクションArgumentList:AssignmentExpressionは次のように評価されます。
- refをAssignmentExpressionの評価結果とします。
- argをGetValue (ref)とします。
- 唯一の項目がargであるリストを返します。
本番のArgumentList:ArgumentList、AssignmentExpressionは、次のように評価されます。
- previousArgsをArgumentListの評価結果とします。
- refをAssignmentExpressionの評価結果とします。
- argをGetValue (ref)とします。
- 長さがpreceedingArgsの長さより1つ長く、アイテムがpreceedingArgsのアイテムであるリストを順番に返し、最後に新しいリストの最後のアイテムであるargが続きます。
そして、上記のいずれかで操作を強制的に発生させる方法はありますか?
最初の2つは同じです。関数が呼び出された時間とパラメーターが関数に渡された時間をどのように区別できるかわかりません。
代わりに関数を渡すことで、3番目を達成できます。
function meowLikeACat(howoften) {
setInterval(function() {
alert("meow");
}, howoften()*1000)
}
var howOften_local = 3;
meowLikeACat(function () {
return howOften_local+1;
});
そして、関数が実行される前に渡されていたデータを「インターセプト」することは可能でしょうか?
コードが敵意ではなく協力を前提としている場合、これは簡単です。
function meowLikeACat(howoften) {
setInterval(function() {
alert("meow");
}, howoften*1000)
}
function intercept(thisArg, original, before) {
return function() {
// could manipulate arguments here,
// or pass something completely different to original
before.apply(thisArg, arguments);
original.apply(thisArg, arguments);
};
}
function doBefore() {
console.log('before', arguments);
}
var meowLikeACatIntercepted = intercept(null, meowLikeACat, doBefore);
デモ: http: //jsfiddle.net/mattball/e4AY6