var a = 2; 引擎认为这里有两个完全不同的声明, 一个由编译器在编译时处理, 另一个则由引擎在运行时处理new Function(..) 函数的行为也很类似, 最后一个参数可以接受代码字符串,并将其转化为动态生成的函数(function foo(){ .. }) 作为函数表达式意味着 foo 只能在 .. 所代表的位置中被访问,外部作用域则不行{ .. } 内部)var a=2;JavaScript实际上会将其看成两个声明。var a;和a=2;第一个定义声明是在编译阶段进行的,第二个赋值会留在原地等待执行阶段for/let行为指出变量在循环过程中不止被声明一次,每次迭代都会声明1、var bar = obj.foo; bar();//会应用默认绑定;2、doFoo(obj.foo);//函数作为参数传递,隐式赋值;3、setTimeout(obj.foo, 100);//函数传入语言内置函数,同样bind(..) 的功能之一就是可以把除了第一个参数(第一个参数用于绑定 this)之外的其他参数都传给下层的函数(这种技术称为“部分应用”, 是“柯里化” 的一种).a 语法通常被称为“属性访问”, ["a"] 语法通常被称为“键访问”. 操作符要求属性名满足标识符的命名规范,而 [".."] 语法 可以接受任意 UTF-8/Unicode 字符串作为属性名. 语法还是 [] 语法), 数组的 length 值并未发生变化(OtherObj.methodName.call(this, ...)), 这会让代码更加难懂并且难以维护[prototype]机制的威力(委托)并且避免不必要的麻烦(比如使用new的构造函数调用会生成.prototype和.constructor引用)Object.create(null)会创建一个拥有空[prototype]链接的对象,这个对象无法委托[Prototype]机制就是指对象中的一个内部链接引用另一个对象[prototype]机制实现的Foo.prototype在a1的[prototype]链上,所以instanceof操作告诉我们a1是Foo类的一个实例。从语法角度上说:instanceof似乎是检查a1和Foo的关系,但实际上它想说的是a1和Foo.prototype(引用的对象)是互相关联的