次の jQuery コードがあるとします。
var FooBar = {
zizzle: function (callback) {
var x, y, z;
// … do stuff with x y and z
callback(z, y, z);
}
}
$("a[href]").each(function () {
var link = this;
// do things with the link, e.g.
$(link).data('fiddle', "deedee")
function do_something() {
console.log("I would use the link variable here:", link)
// lots of code here using link
// blah, blah, blah link
}
$(this).click(function () {
FooBar.zizzle(do_something);
});
});
現在、が定義されているdo_something
関数の内部にあるためlink
、その変数にアクセスできます (クロージャ)。ただし、リンクごとに関数を作成することを避けることができるかどうかは疑問です。私はむしろこれに近いことをしたい:
var FooBar = {
zizzle: function (callback) {
var x, y, z;
// … do stuff with x y and z
callback(z, y, z);
}
}
function do_something() {
console.log("I would use the link variable here:", link)
// lots of code here using link
// blah, blah, blah link
}
$("a[href]").each(function () {
var link = this;
// do things with the link, e.g.
$(link).data('fiddle', "deedee")
$(this).click(function () {
FooBar.zizzle(do_something);
});
});
したがって、それdo_something
は一度だけ作成されます。ただし、これを行うとdo_something
、 の値がなくなりますlink
。
この場合、 のコードを変更するFooBar
ことはできず、コールバックのみが必要であり、追加のパラメーターを送信できないと仮定します。
私が考えた唯一の代替案は、少なくとも必要に応じて関数のみを作成する、次のようなものです。
var FooBar = {
zizzle: function (callback) {
var x, y, z;
// … do stuff with x y and z
callback(z, y, z);
}
}
function do_something_maker(link) {
return function (x, y, z) {
console.log("I would use the link variable here:", link)
// lots of code here using link
// blah, blah, blah link
}
}
$("a[href]").each(function () {
var link = this;
// do things with the link, e.g.
$(link).data('fiddle', "deedee")
$(this).click(function () {
FooBar.zizzle(do_something_maker(link));
});
});
それが最善の選択肢ですか?