为什么有一个深奥的功能而不是一个简单的功能?

时间:2015-07-22 02:39:11

标签: javascript function

我简化了我从某个地方获得的函数(log1)的深奥函数模型。我已经查看了匿名函数和闭包,我不知道这些适用于此处。是否有任何优势的深奥功能与简单的功能(log2)。有人会说明为什么会使用log1模型吗?而且," log1"成为全球名称?

函数在为它们保留的div中累积文本。

<!DOCTYPE html>
<html><!-- HTML5 -->
<head>
  <meta charset="UTF-8">
  <title>..</title>
<script type="text/javascript">

(function() { // this is obviously the abstruse model
  this.log1 = function(txt) {
    var divid = document.getElementById("log1id");
    divid.innerHTML += "<br />" + txt;
    };
  })();

function log2(txt) { // this is obviously the straightforward model
  var divid = document.getElementById("log2id");
  divid.innerHTML += "<br />" + txt;
  };

window.onload = function() {
  log1("Message one");
  log2("Message one");
  log1("Message two");
  log2("Message two");
  }

</script>
</head>
<body>
<div>
body
<div id="log1id">--Log1:</div>
<div id="log2id">--Log2:</div>
</div>
</body>
</html>

2 个答案:

答案 0 :(得分:3)

不是这种情况,不是。它们是等价的。但是,如果你这样做:

(function() {
  var divid = document.getElementById("log1id");
  this.log1 = function(txt) {
    divid.innerHTML += "<br />" + txt;
    };
  })();

var divid = document.getElementById("log2id");
function log2(txt) { // this is obviously the straightforward model
  divid.innerHTML += "<br />" + txt;
};

然后他们确实有所不同:第二个版本将使用divid污染全局环境,而第一个版本则不会。{/ p>

鉴于它们是在全局环境中评估的(其中this是全局对象),两个函数都是全局的。如果没有log2 = ...,则this.log2 = ...相当于var log2,而this则不会更改log1,因此它们都会将属性分配给this全球<ItemTemplate> <asp:LinkButton ID="btnDelete" runat="server" Text="Delete" CommandName="Delete" OnClientClick="javascript:if(!confirm('Are you sure you want to delete this record?')){return false;}"> </asp:LinkButton> </ItemTemplate>

答案 1 :(得分:1)

&#34;深奥&#34;版本完全相同。唯一的区别是在结构范围内声明的任何东西

(function() {
})();

仅在结构范围内。这称为IIFE(立即调用函数表达式),并提供了一种在javascript中实现封装的非常好的方法。

因此,如果log1不是this的属性,那么您将无法调用它。

在跨越多个文件的较大项目中,您可能会意外地使用变量/覆盖另一个文件中的变量。防止这种情况的一个好方法是将整个文件的主体包装在IIFE中。