【问题标题】:Injecting methods/variables into a Javascript scope将方法/变量注入 Javascript 范围
【发布时间】:2011-05-05 19:29:15
【问题描述】:

我希望能够在文件开头使用我不需要的方法。

类似这样的:

var contact = require('contact');

person = contact.create({
    'name': createName()
});

这里我想使用 createName() 函数,即使我没有明确地 require() 它。

以下是 Ruby 中的示例:

# By extending a class it gets the class methods from the parent:
class Section < ActiveRecord::Base
  belongs_to :document
  has_many :paragraphs
end

# By using a block and executing it in an object containing those methods used
namespace "admin" do
  resources :posts, :comments
end

它不必与示例完全一样,而是以某种方式将方法/变量注入代码中而无需显式使用 require(),因此它会像 Ruby 一样优雅和简单。

这在 Javascript 中可行吗?

【问题讨论】:

    标签: javascript ruby node.js


    【解决方案1】:

    编辑:可以只使用 createName() 并且不需要导出它。但是你需要导出包含它的模块。

    示例:(test2.js)

    exports.normal = function() {
        console.log("Exporting is normal");
    };
    
    GLOBAL.superior = function() {
        console.log("Global is superior");
    };
    
    var privateInferior = function() {
        console.log("Private is inferior")
    }
    
    var i_am_a_variable = 5;
    
    var i_m_an_array = [1, 2, 3, 4, 5];
    

    (test1.js)

    var test2 = require('./test2.js');
    test2.normal(); // works!!
    
    superior(); // works!!
    
    privateInferior(); // does not work as it is not global.
    
    console.log(i_am_a_variable); // does not work as it is not global.
    
    console.log(i_m_an_array); // does not work as it is not global.
    
    normal() // does not work as it is exported. Available only via test2.
    

    【讨论】:

    • 但是如果我们不只关注 CommonJS 模块系统,而是关注 Javascript。有没有办法将方法/变量注入另一个范围并像 Ruby 一样在其中使用它们?
    • 是的,您可以(关闭),只要您在同一个文件中执行所有这些操作。但是,当涉及到requiring 文件时,它将无法正常工作。
    • 什么意思,能不能写个例子?
    【解决方案2】:

    如果createNamecontact 中定义,像这样

    exports.createName = func;
    

    然后您可以使用with“导出”它(以及所有其他类似定义的函数/属性)

    with (require('contact')) {
      var name = createName();
    }
    

    功能相同

    var contact = require('contact');
    
    var name = contact.createName();
    

    with 只是根据传递给它的对象创建一个新范围。由于require 只是返回一个对象,它可以与with 结合使用来模拟一些其他语言的命名空间/函数导入能力。请记住将所有内容都用大括号括起来。

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 2015-12-26
      • 2015-08-21
      • 2020-02-07
      • 2012-12-23
      相关资源
      最近更新 更多