以下是可能的:
var someObject = {someProperty : "someValue"};
var someFunction = function() {
someProperty = "anotherValue";
};
// what do I do here, in order to use
// someFunction to change someObject,
// without altering either of those things?
// directly accessing "someObject" in someFunction
// is not an option. e.g., none of this:
/*
var someFunction = function() {
someObject.someProperty = "anotherValue";
};
*/
if(someObject.someProperty=="anotherValue") alert("Hooray!");
如果不是普通的JavaScript,这是否可以在Mozilla的JavaScript for Firefox扩展中使用?
感谢。
答案 0 :(得分:1)
纯粹出于学术目的,这是一种方式:
with (someObject) {
eval('(' +someFunction.toString() + ')();');
}
不要在生产环境中使用它!
[编辑]:只是为了澄清,以下是您如何使用它。
var someObject = {someProperty : "someValue"};
var someFunction = function() {
someProperty = "anotherValue";
};
with (someObject) {
eval('(' +someFunction.toString() + ')();');
}
if(someObject.someProperty=="anotherValue") alert("Hooray!");
它不会引用someFunction中的someObject。
答案 1 :(得分:1)
对于那些可能想知道的人,我发现最接近的是Components.utils.evalInSandbox。这绝对不是完美的,但对于这个问题来说,这是最好的事情。
答案 2 :(得分:0)
不,你不能。
var someFunction = function() {
someProperty = "anotherValue";
};
这里someProperty是一个全局变量(如果以前没有访问过,则创建)。
var someObject = {someProperty : "someValue"};
这里someProperty是对象的键(不是变量)。
因此,在每个上下文中,令牌someProperty指的是不同且完全独立的东西。
如果没有直接引用/调用另一个函数,函数就无法改变对象的值。
答案 3 :(得分:0)
eval("someObject.someProperty='anotherValue'");
那会有用吗?您认为在someFunction中“直接访问”someObject“是什么?”如果你想改变它的属性,你将不得不以某种方式访问someObject ...
答案 4 :(得分:0)
如果您准备修改自己的功能以引用this.someProperty
而不只是someProperty
,那么您可以使用apply
或call
:
var someFunction = function() {
this.someProperty = "anotherValue";
};
someFunction.apply(someObject);
答案 5 :(得分:0)
没有。这完全是关于范围(环境)和属性。
当您说someObject = ...
或someobject.whatever
时,您所说的是在最近的范围内给我someObject
,然后对其进行操作。
范围嵌套。函数创建新范围并捕获周围范围。较近范围内的变量可以影响周围范围内的变量。
您的函数可以查看声明范围内的所有内容,因此可以看到someObject
。
someProperty
是someObject
中键/值对的一部分。没有通过someObject
并要求它检索使用密钥someProperty
存储的值,没有任何东西可以访问它。
答案 6 :(得分:0)
var someObject = {someProperty : "someValue"};
with (someObject)
{
window.someFunction = function() {
someProperty = "anotherValue";
};
}
if(someObject.someProperty=="anotherValue") alert("Hooray!");
不是最好的编码练习,但应该执行你想要的。