javascript – 在范围链中声明一个变量

我怀疑这是可能的,但我想试一试.

我想编写一个函数,将新变量引入其调用者的范围.

目标是做这样的事情:

(function() {
    var x = {a: 5,b:6};
    console.log(typeof a,typeof b); // prints: undefined undefined
    magicImport(x);
    console.log(a,b); // prints: 5 6
})();

// Variables are not in global scope
console.log(typeof a,typeof b); // prints: undefined undefined

如果magicImport(x)做类似的事情

eval("var a = x.a; var b = x.b;");

这并没有真正帮助,因为a和b的范围将限制在magicImport内部.

而且当然

eval("a = x.a; b = x.b;");

是不好的,因为那会修改全局对象.

有没有办法在更高的范围内评估代码?

编辑:目标,如果不清楚,是创建可以导入命名空间的内容而不污染全局范围的函数,而不必将这些导入的对象放入新的容器对象.

解决方法

如您所述,您需要eval,但您必须在需要定义的范围内进行评估.没有办法推迟调用eval. magicImport必须构建要评估的字符串:

(function() {
    var x = {a: 5,typeof b);  // output: undefined undefined
    eval(magicImport(x));
    console.log(a,b);                // output: 5 6
})();

// Variables are not in global scope
console.log(typeof a,typeof b);      // output: undefined undefined

function magicImport(x){
    return "var a=" + x.a + ",b=" + x.b ;
}

另一种方法是跳过函数调用并使用循环.而不是eval(magicImport(x));你可以用以下代替它:

for(prop in x){eval("var " + prop + "=" + x[prop]);}

要么

var str = "";
 for(prop in x){str + = "var " + prop + "=" + x[prop] + ";" ;}
 eval(str);

相关文章

kindeditor4.x代码高亮功能默认使用的是prettify插件,prett...
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小