gpt4 book ai didi

JavaScript:没有 eval 的闭包中自动 getter 和 setter 中的默认参数?

转载 作者:行者123 更新时间:2023-11-30 11:22:03 24 4
gpt4 key购买 nike

注意:此问题是最近提出的问题 JavaScript: automatic getters and setters in closures without eval? 的跟进.

该问题的要点如下:“如何在不使用 eval 语句的情况下自动为闭包中的作用域变量提供 getter 和 setter”。发帖人提供了演示如何使用 eval 执行此操作的代码,用户给出了以下 answer不需要 eval:

function myClosure() {
var instance = {};
var args = Array.prototype.slice.call(arguments);
args.forEach(function(arg) {
instance[arg] = function(d) {
if (!arguments.length) return arg;
arg = d;
return instance;
};
})
return instance;
};

这个问题是关于如何使用上述函数设置/获取作用域变量的默认值。

如果我们简单地为变量 v3 添加一个默认值,我们会得到以下结果:

function myClosure() {
var v3 = 2
var instance = {};
var args = Array.prototype.slice.call(arguments);
args.forEach(function(arg) {
instance[arg] = function(d) {
if (!arguments.length) return arg;
arg = d;
return instance;
};
})
return instance;
}

var test = myClosure("v1", "v2", "v3") // make setters/getters for all vars
test.v1(16).v2(2) // give new values to v1, v2
console.log(test.v1() + test.v2() + test.v3()) // try to add with default v3
// 18v3

没想到会这样。

那么如何为变量提供默认值呢?

注意:请构建以下实现,它在初始化时生成 getters/setters(允许代码作者预定义所有应该有 getters 和 setters 的变量)

function myClosure() {
var instance = function () {};
var publicVariables =['v1', 'v2', 'v3']
function setup() {
var args = Array.prototype.slice.call(arguments);
// if called with a list, use the list, otherwise use the positional arguments
if (typeof args[0] == 'object' && args[0].length) { args = args[0] }
args.forEach(function(arg) {
instance[arg] = function(d) {
if (!arguments.length) return arg;
arg = d;
return instance;
};
})
}
setup(publicVariables)
// setup('v1', 'v2', 'v3') also works
return instance;
}

var test = myClosure()
test.v1(16).v2(2)
console.log(test.v1() + test.v2() + test.v3())

问题:

如何在此设置(代码块上方)中使用自动 getter 和 setter 的默认值?

最佳答案

The gist of that question was as follows: "How can one automatically provide getters and setters for scoped variables in a closure - without the use of the eval statement". There the poster, provided code demonstrating how to do so with eval and the user gave an answer which does not require eval.

不,你不能没有eval。这里所有不使用任何形式的 eval 的答案都不会访问作用域变量,而只是普通属性 - 或者它们创建自己的局部变量。

提供默认值非常简单:

function myClosure(...args) {
var instance = {v3: 2};
// ^^^^^ not a `var`
for (const arg of args) {
let val = instance[arg];
instance[arg] = function(d) {
if (!arguments.length) return val;
val = d;
return instance;
};
}
return instance;
}

关于JavaScript:没有 eval 的闭包中自动 getter 和 setter 中的默认参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49474370/

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