gpt4 book ai didi

javascript - 如何在没有 eval 的情况下编写这段 JavaScript 代码(QUnit 模拟)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:47 24 4
gpt4 key购买 nike

我一直在试验 QUnit 测试,并一直在寻找一种好方法来使用 mocks 覆盖函数,以便启用更多原子测试。针对特定情况有很好的解决方案,例如覆盖 $.ajax ( Simple jQuery (1.5+) AJAX Mocking ),但我一直在寻找更通用的方法并想出了这个:

// Constructor for overrides.
function overrides(overrides) {
this.overrides = overrides;
}

// Implementation for overrides.
overrides.prototype = {
set: function () {
var functions = {};
$.each(this.overrides, function (key, value) {
eval("functions['" + key + "'] = " + key + ";");
eval(key + " = value;");
});
this.functions = functions;
},

reset: function () {
var functions = this.functions;
$.each(this.overrides, function (key, _) {
eval(key + " = functions['" + key + "'];");
});
}
}

然后可以这样使用:

module("Comments", {
setup: function () {
this.overrides = new overrides({ "$.ajax": function (url, options) {
alert("ajax: " + url + ', ' + options);
}
});

this.overrides.set();
},
teardown: function () {
this.overrides.reset();
}
});

现在,一切似乎都工作正常,虽然这可能不是 eval() 最糟糕的使用方式,但我想知道是否真的可以不使用 eval() 来编写?我在这里阅读了一堆其他 eval() 问题并尝试了各种选项,例如使用 window[] 访问覆盖,但这不适用于 $.ajax 案例(例如 window['$'].ajax工作但不是窗口 ['$.ajax']).

也许我也在考虑可以在这里安全地使用 hard 和 eval() 还是一般来说有更好的方法来覆盖函数?

最佳答案

为什么不能把对象当作对象?

functions[key] = key;

var arr = key.split('.');
var obj = window;

for (var i = 0; i < arr.length; i++){
if (obj) obj = obj[arr[i]];
}

obj = value;

关于javascript - 如何在没有 eval 的情况下编写这段 JavaScript 代码(QUnit 模拟)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8706058/

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