JavaScript, 函数 vs 变量

10

我开始探索Javascript和JQuery(因此下面的示例选择了它们)。我发现我可以定义一个函数并调用它(正如预期的那样),但我也可以只是...做些其他事情...这就是问题:

function $() {
    console.log('hi');
}

$()
$

无论是使用函数调用还是仅使用'$'而不调用函数,我都没有收到错误信息。后者实际上在做什么?如果它并没有实际调用函数,为什么它能够正常工作呢?

3个回答

10

它什么也不做。它只是一个变量,恰好保存了一个函数。

这与以下同样无用的代码没有任何区别:

42;

3
42,噫?我明白你的意思了。 - Stuart Wagner
那么,在这种情况下,将函数定义为一个函数(function x() {...})和通过回调将函数添加到变量中(var x = function() {...})有什么区别呢?似乎最终得到的结果是相同的... - Zach Smith
@shmuli:什么?它什么也没做。 - SLaks
@SLaks 是的,我不是认真的。 - shmuli

3
JavaScript对象是键值对的映射。键是字符串,值可以是任何东西。这使得对象非常适合哈希表。
函数是具有额外可调用能力的普通对象。 来源 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#.22Normal.22_objects.2C_and_functions
这意味着您可以执行以下操作:
function test(){
   console.log(1);
}

var a = test;

a();

或者

var test2 = function(){
  console.log(2);
}

或自动调用

//sorry for the indentation.
(
  function(){
     console.log(3);
  }
)()

或创建结构

var testHash = {
   a : 1,
   b : function(){
      console.log(4);
   }
}

testHash.b();

testHash['b']();

并且创建函数难以调用:

//in a browser environment
window['test3'] = function(){
   console.log(5);
} 

window['test space'] = function(){
   console.log(6);
} 

test3() //no error
test space() //error :D

编辑:用户想了解有关自动调用函数的更多信息:

为什么这个能够工作?

(
  function(){
     console.log(3);
  }
)()

这只需要两步就能轻松跟随:

括号,如果我们知道函数和其他变量一样,而且我们知道括号只是用于分组或调用函数。

var test_1 = 'string example';
var length = (test_1).length; // the same that test_1.length

在以下情况下有意义:

var test_1 = 'string';
var test_2 = ' example';
var length = (test_1 + test_2).length; // the same that test_1.length

代替:
var test_1 = 'string';
var test_2 = ' example';
var aux = test_1 + test_2;
var length = aux.length; // the same that test_1.length

现在,这对你有意义吗?:
var length = ('string example').length; // instead the first example

第二步,我们可以更改函数的字符串并调用它。
( function(){ ... } )()

为什么这很有趣呢?现在出现了闭包的概念。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

闭包是JavaScript中非常重要的工具。

谢谢,这是一个非常好的答案。你能解释一下自动调用函数是如何工作的吗? - Zach Smith

1

"$" 这个名称只是该函数的占位符,在执行 "$" 这一行时,只是列出代码的内容(在 Google Chrome 的开发人员工具中)。

$() 是调用该函数的方法。

$ 是说明它所持有的内容。


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