2

有人可以向我解释如何在 QScriptEngine 扩展中获得命名空间吗?我已经设置好了,所以我在 script/ 下有一个目录 foo/,其中正在执行一个 __init__.js 文件。

__setupPackage__(__extension__);
print(__extension__);

hello = function() { return 5; };

在我的 C++ 代码中:engine.evaluate("hello();"); // 工作正常

所以我的问题是,像 foo/bar/whatever (foo.bar.whatever) 这样的文件层次结构有什么意义,如果它们都集中到一个全局命名空间中?我看过一些示例,他们尝试在代码中创建命名空间,但如果没有编译器错误,我似乎无法让它工作。

      foo = {
          hello : function() { return 5; }
      };

在我的 C++ 代码中:

      engine.evaluate("foo.hello();");

我是否误解了 Qt 处理命名空间的方式?不管是从哪个文件中获取的,是否真的应该将所有内容都混入一个全局范围?是否有创建这些类型的名称空间的适当示例?谢谢。

4

3 回答 3

0

如果 QScriptEngine 是一个 JavaScript 实现,那么

var foo = {
          hello : function() { return 5; }
      };

或者

var foo = {};
foo.hello = function() { return 5; };

必须工作得很好。否则,请提供您遇到的语法错误的确切文本。

如果您确实需要命名空间,可以考虑我的 TIScript: http: //www.codeproject.com/KB/recipes/TIScript.aspx

于 2011-07-20T15:43:36.633 回答
0

JavaScript 中不存在命名空间(在 C++ 等语言中已知)。在 JS 中获得类似命名空间的行为的唯一方法是将内容封装在一个对象中,其中对象的名称定义了命名空间

此示例将在 JS 中创建一个“命名空间”foo,其中包含一个方法“bar”,以及一个包含方法“hello”的命名空间“foo.baz”:

var foo = {
    bar : function(){ return 5; },
    baz : {
        hello : function(who){ return 'Hello ' + who + '!'; }
    }
};

希望这对您有所帮助。

于 2011-07-19T07:46:11.713 回答
0

在 JavaScript 中,我们使用闭包来模拟名称空间。这对于在命名空间中隐藏您不想向用户开放的某些功能和属性也很有用

(function(window, undefined){
  //declare a local object
  myNamespace = {};

  //define private variables
  var privateVar; // this wont be accessable outside of the closure

  var privatefunct = function () {
    alert('I can only be called by functions defined within the closure');
  }

  myNamespace.publicVar = "this can be accessed outside the namespace";

  // this function can be called outside the closure
  myNamespace.getPrivateVar = function() {
    return privateVar;
  }

  //add your local object to the global object (aka. window in the browser)
  window.myNamespace = myNamespace;
})(window)

这种模式部分借鉴了 jQuery,但它有几个优点,因为它可以保护您的代码免受恶意代码的影响,这些恶意代码可能会尝试更改 window 或 undefined 的值。

我不确定这是否完全回答了您的问题,但我希望它有所帮助!

于 2011-07-20T15:17:06.613 回答