javascript Iffy结构的区别

时间:2016-05-26 05:32:10

标签: javascript html5

这些js函数结构有什么区别

dataView.onRowCountChanged.subscribe(function (e,args)
{
   $("#RowCount").text(args.current);
});

2 个答案:

答案 0 :(得分:1)

据我所知,前三个没有区别。

当您编写Immediately-Invoked Function Expression时,外部参数括号可以存在于包装括号内部和外部。想一想,就像另一种语法一样。

所以这个:

(
    function() {
    }
());

和此:

(
    function() {
    }
)();

完全平等。

对于第三个示例,分号,在文件串联的情况下,它用作安全措施。编写代码时,您或供应商可能有一个不以分号结尾的脚本。在这种情况下,连接时,以前的文件代码,不以问号结尾将使制作脚本。

在示例中

<强>脚本1.js

var name = 'Nikos';
console.log( name )

<强>脚本2.js

(
    function() {
       // Do some stuff here
    }
)();

<强> concatenation.js

var name = 'Nikos';
console.log( name ) // This line will throw an error, because it is not the last statement in the file.

(
   function() {
       // Do some stuff here
    }
)();

但是如果我们将 script-2.js 更改为:

<强>脚本2.js

;(
    function() {
       // Do some stuff here
    }
)();

concatenation.js 将如下所示:

var name = 'Nikos';
console.log( name )

;(  // This will force the previous statement to finish.
   function() {
       // Do some stuff here
    }
)();

最后我发现了这个:

  

它强制解析器将+后面的部分视为一个   表达。这通常用于调用的函数   立刻,例如:

+function() { console.log("Foo!"); }();
  

如果没有+,那么如果解析器处于一个期望语句的状态(可以是一个语句)   表达式或几个非表达式语句),单词function   看起来像是函数声明的开头而不是   函数表达式,以及它后面的()(在...的末尾)   上面这一行)将是一个语法错误(就像一个缺席的那样)   名称,在那个例子中)。使用+,它使它成为函数表达式,   这意味着该名称是可选的,并导致引用   函数,可以调用,所以括号是有效的。

     
      
  • 只是其中一个选项。它也可以是 - ,!,〜或任何其他一元运算符。或者,您可以使用括号(这   更常见,但在句法上也不是更正确或更不正确):
  •   
(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());

来自:https://stackoverflow.com/a/13341710/1150619

答案 1 :(得分:0)

它们几乎都是一样的。

前两个完全相同。它们定义函数,调用它并评估结果(如果有人将结果用于任何事情)。是否说(function() { })()(function() { })())是一个有争议的问题。有些短裤有强烈的偏好,如果你不按“他们的”方式做,他们会抱怨。在语义上,它们是相同的。在任何一种情况下,初始括号都会强制解析器将其视为函数表达式。在第一种情况下,函数表达式本身用()调用,然后前括号关闭;在第二种情况下,调用括起函数表达式的括号表达式。

后两种情况用于防止连接JS文件时可能出现的问题。感叹号也经常用于此目的。此处包含其他问题,例如https://gist.github.com/anonymous/702cf5630bfc7236ba52f6ec8d7cd7a4thisthisthis