草庐IT

Javascript 命名空间

coder 2024-05-16 原文

我希望将我的 javascript 拆分成不同的文件并为每个文件提供一个像这样的“子”命名空间,从而使我的 javascript 更加模块化。

subA.js

if(typeof ex == "undefined") {
    var ex = {};
}

ex.subA = function() {
//all functions of subA here
}

subB 等也一样

目前我有 1 个文件,ex.js

var ex = (function() {
    //private vars/funcs
    return {
        //public vars/funcs
    }
})();

看起来我应该将我的大部分功能移动到 subA.js 和 subB.js,但仍然在开始时包括 ex.js,然后是 subA.js 和 subB.js。

我有很多问题。

  1. 我很难记住我是如何制作初始命名空间文件 ex.js 的。看起来匿名函数最初是用来将所有内容设为私有(private)的,但我不记得为什么需要将它括在括号中,然后在末尾直接使用 (); 执行。

  2. 从 q1 开始,我的子文件是否应该采用与 ex.js 相同的格式,即,将 anon 函数括在括号中并立即执行?

  3. 看起来子文件只能访问ex 的公共(public)函数,这是真的吗?如果是,我如何允许我的子文件也访问私有(private)函数?

  4. 在我的 HTML 文件中,在我的 document.ready 函数 (jQuery) 中,我应该将 ex 初始化为一个变量,还是可以通过以下方式单独调用每个函数

$(document).ready(function() {
    ex.doSomething();
    ex.doSomethingElse();
}

两者有区别吗?我认为当包含 ex.js 时,会立即创建一个全局变量 ex(由于匿名函数会立即执行),因此我不需要在 document.ready 中重新定义它。

  1. subA.js 中的第一个 if 语句是否与 var ex = ex || 不同? {}; 哪个更好?

  2. 你使用的js代码风格标准是什么?

如果您通读了所有这些内容,您就应该得到赞成票,干杯。

最佳答案

1. function(){ return{}} 是一个闭包,用于为您不希望在该函数范围内的任何其他地方访问的变量和函数添加“隐私”。函数 (function(){}) 两边的括号创建了一个函数表达式。使用它们是因为当您尝试立即执行函数时解析器会报错 function(){}() 而没有将任何参数传递给 ()

2。如果您希望 subA 或任何其他扩展对象拥有自己的子函数,那么是的,您必须这样声明它,但不一定是闭包。

你可以做到

ex.subA = function(x, y){
    return x+y;
}

可以调用 var sum = ex.subA(2, 3);

或者你可以做

ex.subA = (function(){

    return {
        add: function(x, y){
            return x+y;
        },
        multiply: function(x, y){
            return x*y;
        }
    }
})();

然后调用它 var sum = ex.subA.add(2, 3); var multiplication = ex.subA.multiply(2,3);

有很多方法可以做到这一点。

3。是的,它是真的。您可以将私有(private)函数公开。关闭将不允许任何其他方式来做到这一点。

4.如果你想别名,是的,你可以将它分配给一个变量。但是,没有必要。它会按照您描述的方式正常工作。

阅读Essential JavaScript Namespacing Patterns了解 javascript 命名空间中的一些基础知识和模式。


Is the first if statement in subA.js any different from var ex = ex || {}; Which is better?

首先,if语句应该是if(typeof ex == 'undefined')typeof返回一个字符串。无需检查 ex 是否为假。

是的,不一样。如果变量 ex 已经定义,则 if 语句将不会进行任何变量赋值。因此,if语句更好。

What js code style standards do you use?

取决于项目的范围,但主要是使用辅助函数扩展的深层对象。

关于Javascript 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684452/

有关Javascript 命名空间的更多相关文章

  1. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  2. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  3. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  4. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  5. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  6. ruby - 使用 Nokogiri 和 Ruby 命名元素 "text" - 2

    我在尝试使用Nokogiri构建XML文档时遇到了一个小问题。我想将我的元素之一称为“文本”(请参阅​​下面粘贴代码的最底部)。通常,要创建一个新元素,我会执行类似以下的操作xml.text--但它似乎是.text是Nokogiri已经用来做其他事情的方法。因此,当我写这行时xml.textNokogiri没有创建名为的新元素但只是写了意味着成为元素内容的文本。我怎样才能让Nokogiri实际制作一个名为的元素??builder=Nokogiri::XML::Builder.newdo|xml|xml.TEI("xmlns"=>"http://www.tei-c.org/ns/1.0"

  7. ruby-on-rails - Rails 渲染带有驼峰命名法的 json 对象 - 2

    我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'

  8. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

  9. ruby-on-rails - Ruby/Rails 命名约定 - 2

    如果我生成一个名为"product"的脚手架,当我使用它们编写我的应用程序时,它们之间有什么区别?@products,@product,@Product,@Products,产品,Product、product和products(我很确定这些并没有全部用到,但它至少应该让我知道我在做什么'指的是)。对于@/capitalization/plurality的每个组合的含义,我似乎找不到简单的解释。将不胜感激。 最佳答案 你可以阅读Rubystyleguide和Railsstyleguide,您会得到问题的答案。

  10. javascript - jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到) - 2

    我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文

随机推荐