好的,所以解释这个的唯一方法就是举个例子。在javascript中,您可以执行以下操作:
if(condition) {
}
{和}用于标识代码块。但在某些情况下,例如:
window.onload = function() {
}
您需要包含的功能()。为什么它不能只是:
window.onload {
}
为什么需要function()?此外,我认为函数都有一个与它们相关联的名称,并且当调用该名称时函数运行,但为什么在这种情况下是否存在没有关联名称的函数?
答案 0 :(得分:1)
if
,for
,while
,try
,catch
等等都是修改以下声明的statements。例如,如果 if (condition)
表达式求值为condition
(或 truthy ),true
语句将仅执行以下语句。 block statement是一种特殊类型的语句,用于将多个语句组合在一起,允许if
语句应用于代码的更大部分。
但是,window.onload = function() { }
是一个expression - 完全不同的构造。它是一个赋值表达式,由三部分组成,赋值运算符(=
)表示要赋值的表达式(在本例中为function expression)和对变量或属性的引用将该值分配给(window.onload
)。
另请注意,如上所述函数表达式与function statement之间存在差异,因为这通常会导致一些混淆。在这两种结构中,身体周围都需要花括号(与if
语句不同)。
答案 1 :(得分:0)
{
和}
(也称为"花括号")是punctuators,它们主要用于表示代码块,但还有其他用途。
代码块是有条件执行的语句,用于语法的各种生成,例如用于包含与if statement相关的语句:
if (condition) {
// statements to execute if condition is true
}
声明中的函数体:
function foo() {
// statements in function body
}
和表达式:
var foo = function () {
// statements in function body
}
也在for,while和do循环,switch和with语句中,依此类推。 object initialisers(又名object literals)中也使用了圆括号:
var obj = {name: 'foo', age: 42};
现在可能还没有想到很多语法的其他部分。
所以说了所有这些,问题的时间:
为什么需要function()?
表示以下代码块是函数体,而不是其他一些产品。
另外,我认为函数都有与之关联的名称,
对于函数表达式,名称是可选的。该名称仅在函数内部可用(除了某些版本的IE有一个使名称为全局的错误)以允许递归调用:
// Function expression
var foo = function bar() {
// In here, call as bar or foo
};
// Everywhere else, call as foo
foo();
当调用该名称时,函数会运行,但为什么在这种情况下会出现一个没有关联名称的函数?
函数表达式通常分配给变量,该名称用于调用它们。它们也在函数调用中传递,立即执行或分配给对象属性,可以使用普通属性访问器语法调用它们:
var obj = {};
obj.foo = function(){alert('My name is foo')};
obj.foo();
函数声明使用函数名称在声明的范围内创建变量,并将从正文创建的函数对象分配给该变量。在执行任何代码之前处理函数声明。
有很多关于函数表达式与函数声明的文章,请参阅Named function expressions demystified和A closer look at expression closures。
答案 2 :(得分:0)
你认为Javascript(可能是一般的编程语言)是错误的。
首先,if
是一个语句,一个控制程序流的语言结构。它的设计看起来像if (condition) code
。
window.onload
是一个变量。 window
是一个对象,可以包含"其他变量(在这种情况下为onload
),可通过该点符号访问。
在JavaScript中,您几乎可以为变量分配任何内容,因为一切都基本相同。这是令人困惑的,同时也是非常棒的。
您分配了一个函数,该函数通过给定的语法new function(params) {code}
工作。您也可以完成window.onload = 5
或window.onload = {a: 5, b: "foo", c: ["bar", "baz"]}
。 (但这会导致运行时错误,因为您的浏览器无法运行"那个错误就好像您尝试运行var a = 5; a();
)