有没有办法在这里引入局部变量“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函数的快捷方式会很好,这是模块上下文本身的一个局部变量。
EDIT ---没有办法做到这一点----
答案 0 :(得分:1)
如果您的问题是“如何将新的命名值填入现有的范围?”,答案是您不能。你最接近的是:
var obj = (function() {
var iWantThisHere = "whatever";
return {
test: "sure",
n: function() { var x = iWantThisHere + "yaay I have my special variable"; }
};
})();
它为您提供原始示例中的“obj”,加上该对象中定义的任何函数,您可以访问它们共享的“相对全局”变量。
答案 1 :(得分: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没有块级范围。
答案 2 :(得分: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中毫无意义。