2011-11-20 42 views
2

我想了解更多关于Javascript的知识,我一直在使用PHP进行编码和制作web应用程序多年,我对JS有基本的了解,大部分JS我已经使用已经编码并且只是插入直到最近,在过去的几年中,我已经能够用jQuery做很多事情。基本的Javascript函数

我注意到堆栈溢出使用jQuery多于我看过的大多数网站,它是美丽的所有JS功能,他们在这里。

所以一个基本的问题,堆栈溢出使用StackExchange在我看到在这里的大多数JS代码前面。这到底是什么?对我来说,我想说它就像一个类名,但我读JS没有类。

下面是一个例子代码

StackExchange.debug.log("no cache breaker for " + q); 

你能打破这对我解释什么StackExchangedebuglog是谁? 我的意思是我可以说log必须是一个函数调用,但其他人?


PS)请,因为它是一个JS的问题,而不是具体到StackOverflow的 还随意编辑的问题标题和删除这一行,如果你能想到更好的标题不动这META,谢谢

回答

2
EDITED FOR CLARIFICATION 

在我说任何事之前,请参阅How Classical Object-Oriented Programming Translates to Javascript。这是非常重要的理解。现在,这就是说,我会继续:)

JavaScript有一个不幸的特点,你必须非常了解运行时环境,以了解为什么某些语法选择超过另一个表达相同事情(理论上)。 JavaScript运行环境的一个主要注意事项是,无意中将事情引入全局空间是非常容易的。这里有两个快速的例子(这些例子假设你没有任何其他代码编写):

/* 
    * Example 1 
    * This example uses 'object literal notation'. 
    * A link to an article about this is below the example. 
    * This example shows how easy it is to get into the global space just by 
    * not declaring variables properly. 
    */ 
    var myObj = { 
     myMethod: function() { 
      test = 'test'; // oops! now the variable test is in the global 
          // function space :(
          // to avoid this, use var test = 'test'; to keep 
          // test in the scope of myMethod 
     } 
    }; 

阅读object literal notation

/* 
    * Example 2 
    * This example shows how the infamous 'this' can be misused to accidentally 
    * get into the global space. 
    */ 
    var myConstructor = function() { 
     this.test = 'test'; 
    }; 
    var myObj1 = new myConstructor(); // 'this' will by 'myObj1' 
    var myObj2 = myConstructor(); // 'this' will by the global object :(

要了解为什么实例2成立,请参阅this

避免所有这些问题的方法之一就是遵循控制访问全局范围的好模式。正如其中一些答案指出的那样,您可以将StackExchange对象视为用于命名空间的目的,但实际上,它最常用于避免上述示例中列出的问题,还可以防止名称提升等情况。此外,如果您在使用闭包范围时非常聪明(利用javascript中的所有范围都绑定到函数以及在函数中定义函数的事实),则可以使此“命名空间”对象更像传统的其他经典OOP语言对象javascript是一流的数据对象)。此外,由于全球空间非常危险,最好是“成为一名优秀的DOM公民”,并且只在全球空间创建一个封装所有逻辑和数据的对象。

乔尔和杰夫可能实际上设置闭合范围来做信息隐藏JavaScript的方式。以下仅仅是一个例子:

StackExchange = (function() { // give StackExchange it's own scope to prevent 
            // name hoisting and also to allow for private 
            // data 
     var version = '1.0.0'; // version only seen inside function scope 
     return { // return an object that will become 'StackExchange' and whose 
       // methods have access to this function's scope (closure) 
      debug: (function() { 
       // set up logging function that will be determined based on 
       // 'someCondition' (not defined in this code) 
       var loggingFn = (someCondition) : console.log ? alert; 
       return { // return obj with access to this function scope 
        log: function(strToLog) { 
         loggingFn.call(this, strToLog); 
        } 
       };  
      })(), // immediately execute to make object with 'debug' scope access 
      getVersion: function() { 
       return version; // this function has access to StackExchange 
           // scope; therefore, version will be available 
      } 
     }; 
    })(); // immediately execute to make object with 'StackExchange' scope access 

欲了解更多信息,请参阅name hoistingscoping。此外,请阅读Prototypical Inheritance in Javascript以了解用于避免全局范围问题的模式。

+0

感谢例如,我很困惑,我的PHP经验我熟悉“命名空间 - >类 - >功能或财产”我可以将这一点与此有关,但我有很多东西要学。像语法这样的东西,我已经看到了JavaScript函数的定义和调用了几种不同的方式,就好像没有标准语法(我确定有,只是我的基本JS知识让我看到) – JasonDavis

+0

我很好奇,可以深入多层次?而'StackExchange = {}'为什么'debug:{}'有'':“'而另一个没有? – JasonDavis

+0

所以,首先,你是对的,有很多方法可以在javascript中表达事物。主要原因在于,在JS中,每当你写东西的时候,你都必须比大多数其他语言更加注意运行时环境。 – Ryan

6

想的那样的东西很像全球jQuery的功能, “$”(或 “jQuery的”)。它只是一个具有函数和其他属性的对象的全局引用。因此,“调试”是全局“StackExchange”对象的属性,而“log”又是“调试”对象的属性。在这种情况下,“log”属性引用一个函数,这显然是一个调试工具。

JavaScript是否有“类”,但它肯定有对象,这是一个值得商榷的问题。 (通过“可辩论”我的意思是这是一个主题,填补了博客文章和Stackoverflow问题层出不穷:-)

这就是说,实际上,基本的JavaScript。没有什么超级幻想或棘手的。

1

此代码将定义执行您的示例中显示的调用所需的对象。如你所见,它只是定义一个包含更多对象的对象,最终包含一个或多个函数。

var StackExchange = { 
    debug: { 
     log: function(whatever) { /* some code */ } 
    } 
}; 

StackExchange.debug.log("no cache breaker for " + q); 
1

StackExchange是一个全局对象,调试是另一个对象,它是StackExchange对象的一个​​属性,它有一个叫做log的函数。

了解更多关于JavaScript中对象的信息here