2014-10-12 87 views
-2

考虑:JavaScript引擎如何创建变量?

var s1 = { 
    a: 1, 
    b: s1.a  
};  

alert(s1.b); // Uncaught TypeError: Cannot read property 'a' of undefined 

任何人都可以揭示JavaScript引擎的为什么是这种情况的内部工作灯?

目前我被迫使用:

var s2 = { 
    a: { 
     a: 1 
    }, 
    b: { 
     a: function() { return s2.a.a} 
    } 
}; 

alert(s2.b.a()); // 1 
+4

这有没有关系如何“引擎创建变量”。而只是语言如何工作。在这种情况下,不重要的是,在右边表达式被评估之后,对变量的赋值只发生**。 (除非's1'已经被赋值,否则这将导致不同的错误。在新的控制台中再次运行它以追踪“核心”问题。) – user2864740 2014-10-12 09:58:59

+0

关键部分是对象字面值 - 表达式右首先将分配标志评估为整体。它非常有意义;根据定义,对象文字是原子结构。 – raina77ow 2014-10-12 10:01:16

+0

这个问题在SO中被问过几十次,无论是这个变体还是'b:this.a'变体。 – 2014-10-12 12:12:10

回答

1

这里面声明:

var s1 = { 
    a: 1, 
    b: s1.a  
}; 

s1还没有定义,直到数据声明的结尾,因此它不能被称为在数据声明中。这正是Javascript的工作原理。

你可能只是这样做,而不是:

var s1 = { a: 1 }; 
s1.b = s1.a;