需要一些帮助来理解这个JavaScript

时间:2009-11-01 19:52:27

标签: javascript jquery

我在js文件中有以下奇怪的代码,我需要一些帮助来理解最新情况。令我困惑的是,为什么整个事情都被置于paranthesis?这是什么意思?

(function() {
  var someobj = window.someobj = [];
  var parentId = '#wrapper';

  $(document).ready(function() {
    //some code here
    });


  $(document).ready(function() {
    //some code here    
      }
    });

7 个答案:

答案 0 :(得分:3)

如果您提供的代码已完成(除了两个$(document).ready(function() {});语句中的内容之外),则此代码不执行任何操作,并且该函数永远不会执行。无论有没有包裹括号,它都是一样的。

通过将函数包装在括号中,您可以创建anonymous function。但是,该函数必须立即执行,或存储在变量中(这将取消匿名部分)。您经常会看到这种技术,以避免使用临时变量或仅用于初始化较大应用程序的变量来污染全局范围。例如。

(function() {
  // Do initialization shtuff
  var someLocalVariable = 'value';
})(); 
// Notice the `();` here after the closing parenthesis.  
// This executes the anonymous function.

// This will cause an error since `someLocalVariable` is not 
// available in this scope
console.log(someLocalVariable);

那么,您的代码缺失的是函数末尾的右括号后面的();。以下是您的代码应该(大概)的样子:

(function() {
  var someobj = window.someobj = [];
  var parentId = '#wrapper';

  $(document).ready(function() {
    //some code here
  });


  $(document).ready(function() {
    //some code here    
  });
})();

答案 1 :(得分:2)

看起来这个代码并不完整。如上所述,此代码根本不会执行任何操作。你最近错过了一个关闭的paren和一组额外的括号吗?

在JavaScript中,没有模块系统,因此无法创建具有自己的顶级定义的模块,这些定义不会与可能使用的其他模块冲突。

为了克服这个问题,人们使用匿名函数定义来避免名称冲突。你要做的是创建一个匿名函数,并立即执行它。

(function () { /* do stuff */ })();

这会创建一个函数,然后立即执行它而不带参数。在该函数中使用var定义的变量不会与其他地方定义的变量冲突,因此您将获得与您自己的私有名称空间相同的名称,就像模块系统所提供的那样。

答案 2 :(得分:1)

外括号在这里是多余的(虽然你的代码中有一个拼写错误,但我认为你错过了结束);)。有时,为了清楚起见,人们会在括号中包含一个函数,以便立即调用函数,例如

(function($) { 
    //some jQuery code    
})(jQuery);

在上面的函数中,参数$将具有外部jQuery变量的值。这是在jQuery和jQuery插件中完成的,以防止$符号与其他框架发生冲突。

答案 3 :(得分:0)

我将假设这实际上是匿名函数定义的一部分,这就是为什么它在括号中。我可以看到这样做,如果有某种逻辑会使window.someobj根据不同的条件进行更改,但是代码会进一步做同样的事情。

答案 4 :(得分:0)

对于此代码而言,括号实际上并不是必需的。这段代码似乎并不完整。该函数通过将变量设置为页面上的某个对象然后设置另一个常量来初始化。然后有两个看似相同的触发器会在页面加载时触发一些代码。

似乎不是一段非常有用的代码。是否有一些较大的部分可能会对此有所了解?

答案 5 :(得分:0)

在JS中,您可以声明一个函数并在之后自动调用它:

( function Test() { alert('test'); } )();

答案 6 :(得分:0)

括号定义临时范围。在JavaScript中这样做有时很有用。在John Resig的学习高级JavaScript的优秀指南中有很多例子和进一步的解释:

http://ejohn.org/apps/learn/#57