var a = 2;
引擎认为这里有两个彻底不一样的声明, 一个由编译器在编译时处理, 另外一个则由引擎在运行时处理new Function(..)
函数的行为也很相似, 最后一个参数能够接受代码字符串,并将其转化为动态生成的函数(function foo(){ .. })
做为函数表达式意味着 foo
只能在 ..
所表明的位置中被访问,外部做用域则不行{ .. }
内部)var a=2;
JavaScript实际上会将其当作两个声明。var a;
和a=2;
第一个定义声明是在编译阶段进行的,第二个赋值会留在原地等待执行阶段for/let
行为指出变量在循环过程当中不止被声明一次,每次迭代都会声明一、var bar = obj.foo; bar();
//会应用默认绑定;二、doFoo(obj.foo);
//函数做为参数传递,隐式赋值;三、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(引用的对象)是互相关联的