在javascript中更改全局函数范围

时间:2010-02-11 21:24:14

标签: firefox-addon javascript

以下是可能的:

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扩展中使用?

感谢。

7 个答案:

答案 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,那么您可以使用applycall

var someFunction = function() {
  this.someProperty = "anotherValue";
};

someFunction.apply(someObject);

答案 5 :(得分:0)

没有。这完全是关于范围(环境)和属性。

当您说someObject = ...someobject.whatever时,您所说的是在最近的范围内给我someObject,然后对其进行操作。

范围嵌套。函数创建新范围并捕获周围范围。较近范围内的变量可以影响周围范围内的变量。 您的函数可以查看声明范围内的所有内容,因此可以看到someObject

somePropertysomeObject中键/值对的一部分。没有通过someObject并要求它检索使用密钥someProperty存储的值,没有任何东西可以访问它。

答案 6 :(得分:0)

var someObject = {someProperty : "someValue"};
with (someObject)
{
  window.someFunction = function() {
   someProperty = "anotherValue";
  };
}

if(someObject.someProperty=="anotherValue") alert("Hooray!");

不是最好的编码练习,但应该执行你想要的。