我开始探索Javascript和JQuery(因此下面的示例选择了它们)。我发现我可以定义一个函数并调用它(正如预期的那样),但我也可以只是...做些其他事情...这就是问题:
function $() {
console.log('hi');
}
$()
$
无论是使用函数调用还是仅使用'$'而不调用函数,我都没有收到错误信息。后者实际上在做什么?如果它并没有实际调用函数,为什么它能够正常工作呢?
我开始探索Javascript和JQuery(因此下面的示例选择了它们)。我发现我可以定义一个函数并调用它(正如预期的那样),但我也可以只是...做些其他事情...这就是问题:
function $() {
console.log('hi');
}
$()
$
无论是使用函数调用还是仅使用'$'而不调用函数,我都没有收到错误信息。后者实际上在做什么?如果它并没有实际调用函数,为什么它能够正常工作呢?
它什么也不做。它只是一个变量,恰好保存了一个函数。
这与以下同样无用的代码没有任何区别:
42;
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中非常重要的工具。"$" 这个名称只是该函数的占位符,在执行 "$" 这一行时,只是列出代码的内容(在 Google Chrome 的开发人员工具中)。
$() 是调用该函数的方法。
$ 是说明它所持有的内容。