问题的逻辑属于实验性质,不需要讨论它的合理性,问题背景为:
在一个函数中,我定义了多个局部变量,然后定义了一个json对象,json对象中的属性和定义的局部变量构成一一对应的关系。
function testFn(){
var name='nihao';//定义的局部变量
var age=18;//定义的局部变量
var height=172;//定义的局部变量
var obj={//定义的json对象,属性名和上面的其他局部变量构成一一对应的关系
'name':'obj_nihao',
'age':20,
'height':183
}
for(var i in obj){
//通过i来识别到局部变量,比如i为'name'时,让name=obj.name
//让obj中的属性修改局部变量的值
}
console.log(name,age, height);
}
testFn();
现在想让obj一级属性一一对应的去修改局部变量的值,比如让obj.name去修改name变量的值,obj.age去修改age变量的值,以此类推。可惜我并没有找到解决方案。
现在我写了一个并不优雅,也不是我追求的自动识别的方案,代码如下:
function testFn(){
var name='nihao';//定义的局部变量
var age=18;//定义的局部变量
var height=172;//定义的局部变量
var obj={//定义的json对象,属性名和上面的其他局部变量构成一一对应的关系
'name':'obj_nihao',
'age':20,
'height':183
}
'name,age,height'.split(',').forEach(function(item,index){
switch(index){
case 0:name=obj[item];break;
case 1:age=obj[item];break;
case 2:height=obj[item];break;
}
});
console.log(name,age, height);
}
testFn();
这段代码也是傻的可怜,可惜确实没有找到识别这些变量值为值类型的变量的名字的方案,说的好绕口。
这个问题有点奇怪,是我在封装UI组件时思考的问题,希望大神们不惜赐教,大家一起来讨论分析下。
function testFn() {
this.name = 'nihao'; //定义的局部变量
this.age = 18; //定义的局部变量
this.height = 172; //定义的局部变量
var obj = { //定义的json对象,属性名和上面的其他局部变量构成一一对应的关系
'name': 'obj_nihao',
'age': 20,
'height': 183
}
Object.keys(obj).forEach(function(v,i){
this[v] = obj[v]
})
console.log(name, age, height);
}
testFn();
// obj_nihao 20 183
符合你的要求但是是bad practice :)
function testFn(){
var name='nihao';//定义的局部变量
var age=18;//定义的局部变量
var height=172;//定义的局部变量
var obj={//定义的json对象,属性名和上面的其他局部变量构成一一对应的关系
'name':'obj_nihao',
'age':20,
'height':183
}
var source = testFn.toString()
for (var i in obj) {
var re = new RegExp("var\\s*" + i + "\\s*=\\s*.*"); \\ 这个匹配变量不完美:(
if (source.match(re) && source.match(re).length !== 0) {
var newValue = (typeof obj[i] === 'string' || typeof obj[i] === 'object')
? JSON.stringify(obj[i])
: obj[i]
var newCode = "var " + i + "=" + newValue
eval(newCode)
}
}
console.log(name);
console.log(age);
console.log(height)
}
testFn(); // obj_nihao 20 183
我觉得这个问题本身就别扭,你完全可以使用callback的方式来解决或者写一个业务封装类吧。