2011-11-28 51 views
3

下面仅仅是我发布的一些示例Javascript,它展示了定义和调用javascript函数的两种不同方式。用Javascript定义和调用函数的最佳方式

这些不同的方法是否有一个名称?

哪种方法是首选?

第一个代码块看起来非常简单,几乎相同的程序PHP函数的定义和调用。

我实现第二设置更像是一个类/命名空间,它只是让对我来说有点混乱,因为我没有学JavaScript的太多呢。我是否认为所有这些函数都可以用任何一种方法编码为第一或第二代码块并仍然有效?

很抱歉,如果我的问题不够清楚,如果需要的话我会修改,感谢您的帮助/信息

initCommentsHelp(); 

function initCommentsHelp() { 
    $('#view-comments-help-a').live('click', function() { 
     $('#comments-help').slideToggle("normal"); 
     return false; 
    }); 
} 

VS这样

Screenshot.Like.Shot.toggle(); 
Screenshot.Comment.toggle(); 
Screenshot.Flag.flag(); 
Screenshot.Flag.unflag(); 

var Screenshot = { 
    Like: { 
     Shot: { 
      toggle: function() { 
       if ($('.fav a.fav-toggle.processing').length == 0) { 
        $.ajax({ 
         type: 'POST', 
         url: url, 
         data: data, 
         beforeSend: function() { 
          $('.fav-toggle').addClass('processing'); 
          $link.text('Wait...'); 
         }, 
         success: function(responseHtml) { 
          $('#like-section').replaceWith(responseHtml); 
         } 
        }); 
       } 

       return false; 
      } 
     }, 
    Comment: { 
       toggle: function() { 
        var link = $(this); 
        var data = link.hasClass('liked-by-current-user') ? {_method: 'delete'} : null; 
        $.ajax({ 
         type: 'POST', 
         url: this.href, 
         data: data, 
         success: function(responseHtml) { 
          link.closest('.comment').replaceWith(responseHtml); 
         } 
        }); 

        return false; 
      } 
     } 
    }, 
    Flag: { 
     // Flag a screenshot as inappropriate or Appropriate 
     flag: function(){ 
      var link = $(this); 
      var screenshotId = link.modelId(); 
      if(!confirm("Are you sure you want to flag this shot?")) 
       return false; 

      $.ajax({ 
       type: 'POST', 
       url: this.href, 
       data: { 
        screenshot_id: screenshotId 
       }, 
       success: function(responseHtml) { 
        $('#flag-section').html(responseHtml); 
       } 
      }); 

      return false; 
     }, 
     unflag: function() { 
      var link = $(this); 
      var screenshotId = link.modelId(); 
      $.ajax({ 
       type: 'POST', 
       url: this.href, 
       data: { 
        _method: 'delete', 
        screenshot_id: screenshotId 
       }, 
       success: function(responseHtml) { 
        $('#flag-section').html(responseHtml); 
       } 
      }); 

      return false; 
     } 
    }, 
}; 

回答

5

第一种方法通常是优选的用于写入的独立功能。你可以把它们写为

function testFunction() { 
    // your code here... 
} 

var testFunction = function() { 
    // your code here... 
} 

您已发布用于命名空间的对象第二个例子。您可以在本文中阅读有关命名空间的更多信息:Namespacing in JavaScript

0

一个是定义在一个对象的功能另一个只是自己定义一个函数。函数是JavaScript中的第一类对象,因此它们不需要定义对象。

2

函数是一个对象属性(通过对象引用调用,例如obj.func())就是所谓的“方法”。与对象无关的函数被称为“自由函数”。方法具有特殊的访问权限,不具有免费功能。这些特权的确切含义取决于语言,但所有OO语言都包含一个在函数体内可用的特殊变量(您可以认为它是一个隐藏参数),以访问该方法所绑定的对象。在JS中,这个参数的名字是this

this存在于自由的功能,它指的是全局对象。您可以将自由函数和全局变量视为全局缺省对象的属性。对于浏览器,全局对象是window。然后,自由函数与全局变量类似,一般为bad。自由函数并不像全局变量那样经常引起问题,但它们仍然可以并且出于相同的原因。因此,一些开发人员使用对象作为名称空间来防止名称冲突。

例如,一个模块可能会创建一个sign函数,该函数返回一个数是正数,负数还是零。另一个模块可能具有数字签名消息的sign函数。这些模块由不同的公司创建,每个公司都不知道其他公司。想象一下,开发者想要使用这两个模块。如果两者都被定义为自由函数,那么定义为自由函数将取代其他模块中的第一个破坏性破坏。为了防止这种情况,可以将每个函数定义为单独对象的属性。

自由函数和方法之间的实际区别在于它们如何被访问。方法以对象的属性的形式访问,而自由函数可以通过名称或变量直接访问。请注意,根据您的访问方式,可以将相同的功能视为方法或自由功能。

var obj = { 
    type: 'method', 
    meth: function(){ 
     return this.type; 
    } 
}; 
var func = obj.meth, 
    name = 'free'; 

// the following two lines call the same function, though `this` will be bound differently for each. 
obj.meth(); // returns 'method' 
func();  // returns 'free' 

你甚至可以乘坐免费的功能,并在许多方面把它作为一种方法:

function func(a, b) { 
    return this.foo+a+b; 
} 
var obj = {foo: 'bar'}; 
// call func as a method using the `call` method 
func.call(obj, 'baz', 'bam'); 
// call func as a method using the `apply` method 
func.apply(obj, ['baz', 'bam']); 

// call func as a method in the usual way 
obj.meth = func; 
obj.meth(1, 2); // 'foo12' 

如果你在你的第二个样本更仔细观察,你会注意到,大多数的该方法使用this变量。这些必须保持方法;使他们免费的功能可能会导致错误。

相关问题