我这样做了一段时间,我从未见过任何错误。但是,不幸的是,我从来没有能够解释为什么这有效。
第一行创建一个指向函数的变量。第二行只是将func2
添加到func1
,用点分隔并定义一个函数。
如果我在var
前面添加func1.func2
,那么我会看到编译错误。
func1.func2 = function(){};
错误
SyntaxError: missing ; before statement
var func1.func2 = function(){};
第一行的func1
是什么类型,第二行是什么类型。
var func1 = function(){};
func1.func2 = function(){};
答案 0 :(得分:2)
variable statement的一种形式是:
var identifier [optional assignment];
变量语句中的标识符必须符合rules for identifier names,其中之一是它们不能包含“。”。字符。所以:
var func1 [...];
没关系,但是:
var func1.func2 [...];
不是。解释器停在标识符处,因为它是语法错误,就是这样,它无法继续进行赋值。
答案 1 :(得分:1)
func1
是两个行的函数。您可以使用typeof
确认这一点:
var func1 = function(){};
typeof func1; // "function"
func1.func2 = function(){};
typeof func1; // "function"
答案 2 :(得分:1)
JavaScript中的函数也是一个对象,它可以具有以下属性:
function func1(){} // a function object
console.log(func1.name); //=> "func1"
匿名函数没有名称,但它仍然是一个函数对象,所以:
第1行的func1是什么类型,第2行是什么类型。
仍然是一个函数,属性func2
包含另一个匿名函数。
答案 3 :(得分:1)
func1.func2 = function(){};
如果未定义func1
,则您尝试访问undefined
的属性,这会导致抛出异常。
var func1.func2 = function(){};
// SyntaxError: Unexpected token .
JavaScript语法不允许将点插入变量的名称,因此解释器返回语法错误错误。
var func1 = function(){};
func1.func2 = function(){};
javaScript中的函数是一个Function对象,因此,作为所有javascript objecta,可以在运行时动态地向其添加一个方法。所以func1
是函数对象,func2
是另一个函数对象。这是实现您想要做的事情的正确方法。