好的,我看到一些针对Java的引用,但不是javascript(希望你知道它完全不同)。所以这是特定的代码:
function Sandbox() {
var args = Array.prototype.slice.call(arguments)
, callback = args.pop()
, modules = (args[0] && typeof args[0] === 'string' ? args : args[0])
, i;
if (!(this instanceof Sandbox)) {
return new Sandbox(modules, callback);
}
if (!modules || modules[0] === '*') {
modules = [];
for (i in Sandbox.modules) {
if (Sandbox.modules.hasOwnProperty(i)) {
modules.push(i);
}
}
}
for (i = 0; i < modules.length; i++) {
Sandbox.modules[modules[i]](this);
}
this.core = {
'exp': {
'classParser': function (name) {
return (new RegExp("(^| )" + name + "( |$)"));
},
'getParser': /^(#|\.)?([\w\-]+)$/
},
'typeOf': typeOf,
'hasOwnProperty': function (obj, prop) {
return obj.hasOwnProperty(prop);
},
'forEach': function (arr, fn, scope) {
scope = scope || config.win;
for (var i = 0, j = arr.length; i < j; i++) {
fn.call(scope, arr[i], i, arr);
}
}
};
this.config = {
'win' : win,
'doc' : doc
};
callback(this);
}
如何从this.core.forEach中访问this.config.win?或者这不可能吗?
答案 0 :(得分:5)
在Sandbox()函数的主体中,如下所示:
var self = this;
然后;
self.config.win
在核心部分,当上下文敏感的'this'发生了变化时
答案 1 :(得分:1)
您也可以使用函数表达式,但这需要您在this.config
之前定义this.core
。这可以防止您必须使用局部变量。但请注意,这会捕获值而不是引用它,因此如果您为config
分配新值,它将对forEach
没有影响。但是,由于未克隆对象,您仍然可以更改config.win
。这种行为可能很微妙,如果使用不当会导致错误。
尽管如此,最好按照乔纳森的建议使用var self = this;
。然而,这是另一种方法,并且具有有用的情况。
this.config = {
'win' : "win",
'doc' : "doc"
};
this.core = {
'exp': {
'classParser': function (name) {
return (new RegExp("(^| )" + name + "( |$)"));
},
'getParser': /^(#|\.)?([\w\-]+)$/
},
'typeOf': typeOf,
'hasOwnProperty': function (obj, prop) {
return obj.hasOwnProperty(prop);
},
'forEach': (function(config){
function (arr, fn, scope) {
scope = scope || config.win;
for (var i = 0, j = arr.length; i < j; i++) {
fn.call(scope, arr[i], i, arr);
}
}
})(this.config)
}