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(引用的对象)是互相关联的