这些JavaScript函数之间的区别

4

这两个函数的区别:

(function($){
  console.log($);
}("test"));

(function($){
  console.log($);
})("test");

我已经在网页控制台上尝试并按下“运行”按钮。它们返回相同的结果。那么改变括号位置究竟有什么区别呢?
我认为第二个会立即运行,对吗?

1
你是怎么想到有区别的呢? - Matti Virkkunen
1
参见:https://dev59.com/BXA75IYBdhLWcg3wRW2c,https://dev59.com/UG865IYBdhLWcg3wfuwk等。 - nnnnnn
3个回答

2
我能想到的唯一区别是:如果你在第一个括号内给函数分配一个变量,根据分组的不同,你将得到不同的结果。
var test;

(test = function(arg) {
  console.log(arg)
})('I am the argument!')

这个符合预期:它将 'test' 赋值给函数,然后使用第二组括号中的参数运行该函数一次。这与设置 test 然后使用 test('我是参数!') 运行它相同。

那么另一种方式呢?

var test;

(test = function(arg) {
  console.log(arg)
}('I am the argument!'))

test未定义!为什么?因为当您将括号紧挨着函数放置时,它会在将其分配给变量之前调用该函数。如果您将赋值语句括在括号中然后运行它(示例1),那么一切都会顺利进行。


2
这两段代码是相同的,它们都没有返回值,并且都将它们的参数记录到控制台中。同样地,这两个匿名函数都使用参数"test"进行调用。
唯一的区别在于语法,涉及到函数定义与其应用于参数的分组方式。第一个函数将函数定义与()运算符分组,而第二个函数将函数定义与其应用程序分开分组。
最终,没有语义差异。这两个片段都包含一个匿名函数,该函数记录其参数,然后使用参数"test"进行调用。

1

完全没有区别

第一种情况下,您在不带作用域的函数中给出“test”值,并且没有任何区别。以两种方式都可以以同样的方式工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接