gpt4 book ai didi

javascript - 无论如何要避免每次都创建一个 JavaScript 函数? (替代关闭)

转载 作者:行者123 更新时间:2023-11-29 14:54:39 25 4
gpt4 key购买 nike

假设我有以下 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));
});
});

这是最好的选择吗?

最佳答案

给你:

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:", do_something.link);
//if no link exists, abort
if(!do_something.link){return;}
//code with do_something.link


//you might want to delete afterwards
//delete do_something.link;
}

$("a[href]").click(function () {
do_something.link = this;
FooBar.zizzle(do_something);
});

如果你有一些异步和缓慢的进展,你可以尝试让它像 do_something_maker 或 bind/$.proxy 方法一样懒惰,但每个链接只一次(第一次点击并将它添加到 $.data) .

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:", this);

}

$("a[href]").click(function () {
var fn = $.data(this, 'zizzleCB') || $.data(this, 'zizzleCB', do_something.bind(this));
FooBar.zizzle(fn);
});

关于javascript - 无论如何要避免每次都创建一个 JavaScript 函数? (替代关闭),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19939728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com