在执行阶段报错。
题主这个问题还不需要关心编译的过程。这段代码编译是没问题的,唯一要留意的是变量提升(
variable hoisting),但在这里就算不看变量提升也不影响结果。
题主原本的代码:(格式化一下)
var foo = { fn1: function() { return 1; }, fn2: foo.fn1() // TypeError: Cannot read property 'fn1' of undefined }
这个代码可以等价看作拆解的形式:
var foo // foo is undefined now var tmp = { } tmp.fn1 = function() { return 1; } tmp.fn2 = foo.fn1() // TypeError: Cannot read property 'fn1' of undefined foo = tmp
赋值表达式或者带初始化的变量声明都是,要在赋值符号的右手边的表达式求值完成之后,才会把右手边的值赋予左手边的表达式。
而不是题主显然以为的:
var foo // foo is undefined now foo = { } foo.fn1 = function() { return 1; } foo.fn2 = foo.fn1() // works!
问题解决。