2011-06-03 71 views
-1

有什么办法来介绍本地变量“iWantThisHere”在这里,这样我就可以调用obj.n()假冒功能本地变量

var obj = { 
    test: "sure", 
    n : function(){ console.log(iWantThisHere); } 
}; 

我试着用:

function fake(methods){ 
    var F = new Function('methods', "var iWantThisHere = 'u have it', obj = {}; for(var meth in methods){ obj[meth] = methods[meth] } return obj;"); 

    return F(methods); } 

console.log(fake(obj), fake(obj).n()); 

我不想在这里使用全局变量。设想一个模块化系统,其中每个模块使用例如一个util类,它例如在App对象中定义。所以我必须输入例如App.utils.map或类似的东西。如果有一个这个util函数的快捷方式是模块上下文本身的一个局部变量,那将是很好的。

编辑 ---那里有没有办法做到这一点----

+5

咦?你到底在说什么? – SLaks 2011-06-03 22:27:03

+0

你完全不清楚你想要这个变量是做什么,或者做什么,或者其他任何事情。 – Pointy 2011-06-03 22:27:16

+0

由于范围链的工作方式,你可以在全局范围内引入这个变量,并且它会被选中 - 除非脚本在本地范围内明确定义了它自己的版本,在这种情况下,我没有看到很多希望:函数将始终使用它定义的范围中的函数,如果它存在的话。 – Reid 2011-06-03 22:28:29

回答

1

介绍闭包:

var obj = (function(){ 
    var R = {}; 

    R.iWantThisHere = 5; 

    R.log = function() { 
     console.log(R.iWantThisHere); 
    } 

    return R; 
})(); 

演示:

> obj.log() 
5 
> obj.iWantThisHere = 6 
> obj.log() 
6 

这是最常见的(我敢说推荐)的方式做的JavaScript编程,通过创建功能来限制变量的作用域。这是必要的,因为JavaScript没有块级的范围。

1

如果你的问题是,“我怎样才能东西一个新的命名值转换成alreay,现存的范围是什么?”,答案是你不能。你能来最接近的是:

var obj = (function() { 
    var iWantThisHere = "whatever"; 
    return { 
    test: "sure", 
    n: function() { var x = iWantThisHere + "yaay I have my special variable"; } 
    }; 
})(); 

这使你的“目标文件”,你在你原来的例子有,加上在该对象定义的任何功能,您就可以访问“相对全局”变量他们都分享。

+0

好吧thx,我尝试了一些hacky函数,将传入的obj打包成json类似的字符串,并将它解压到新的作用域中,但这不是一个合适的解决方案 – 2011-06-03 22:39:11

1

有什么特别的理由要这么做吗?为什么不只是在obj.n的函数中添加一个参数?

var obj = { 
    test: "sure", 
    n : function(iWantThisHere){ console.log(iWantThisHere); } 
}; 

obj.n("yeah"); 

或者更简单(虽然作用域变得丑陋):

var iWantThisHere = "dance time"; 
var obj = { 
    test: "sure", 
    n : function(){ console.log(iWantThisHere); } 
}; 
obj.n(); 

或者有倒闭,再加上你怎么分开他们的公共和私人部分的一些细节:

var obj = (function() { 
    var privateVariable = "i'm private"; 

    function privilegedMethod() { 
    }; 

    return { 
    iWantThisHere: "", 
    test: "sure", 
    n: function() { 
     console.log(this.iWantThisHere); 
    }, 
    publicVariable: "i'm public", 
    publicMethod: function() {} 
    }; 
})(); 

obj.iWantThisHere = "hi"; 
obj.n(); // logs "hi" 
obj.addedMethod = function() { console.log("I've been added"); } 
obj.addedMethod(); // logs "I've been added"; 
console.log(obj.privateVariable); // logs undefined (unavailable outside closure) 
console.log(obj.publicVariable); // logs "i'm public" 

的其他答案也包括封闭符号。但是底线是,如果你可以随处注入新的变量,闭包和受限范围在JavaScript中将毫无意义。

+0

我不确定他是否想要提供它一些真正的日志记录,但如果他不带任何参数地调用obj.n(),那么至少会使其记录未定义。再次不清楚他究竟想要什么。 – Robert 2011-06-03 22:37:47

+0

感谢您关闭课程,但您错过了这一点 – 2011-06-03 23:05:49