变量赋值
变量赋值分为两个动作:
如果当前没有声明过,那编译器会在当前作用域声明一个。
运行时引擎会在作用域查找该变量,如果找到就对其赋值。
查询有:LHS查询和RHS查询。LHS
:赋值操作的目标是谁。RHS
:谁是赋值操作的源头,restrieve his source value(取到它的源值)。
举个栗子:
// RHS引用,取到a的值。
console.log(a);
// LHS引用,只需要对=2这个赋值操作找到一个目标
a = 2;
查看下面这个函数分别有几次LHS和RHS?
function foo(a) {
var b = a;
return a + b;
}
var c = foo(2);
其中有3次LHS:
c = foo(2)
a = 2
b =a
4次RHS:
foo
a //因为要把a的值赋给b
a+b中的a和别分别一次
函数表达式和函数声明简单区分
使用关键字function
来判断是否为第一词来区分,如果是为函数声明,如果不是那么就是函数表达式。
// 函数表达式
(function xxx(){})();
// 函数声明
function xxx()
IIFE
IIFE: Immediately Invoked Function Expression(立即执行函数表达式)。
变量提升
所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程称为“提升”。
函数声明会被提前到普通变量之前,如果存在同名的函数,后面的函数声明会覆盖前面的。
所有的变量都是先有声明,再有赋值。栗子:
var a = 2;
// 第一步为编译阶段任务
var a;
// 第二步执行阶段任务
a = 2;
如何判断this
函数是否在new中调用?如果是,
this
绑定的是新创建的对象。函数是否通过call、apply或者硬绑定?如果是,
this
绑定的是指定的对象。函数是否在某个上下文中调用?如果是,
this
绑定上下文对象。如果都不是,使用默认绑定。严格模式绑定到
undefined
,否则为全局对象。foo.call(null) 使用默认绑定规则。
箭头函数的绑定是无法被修改的(不适用于前4条规则),继承外层函数调用的
this
绑定。
属性描述符
writeable:属性的值是否可以修改。
configable:属性的值可配置。如果是可以配置的,那么就可以使用
defineProperty()
方法来修改属性描述符。这种设置为单向,不可取消。意思是可以从true
到false,但是不能从false
到true
。如果值为false
则禁止删除这个属性。enumerable:是否为可枚举的。如果是
false
那么在使用for...in
的时候不会出现。
PS:今天看到本子上随意写的,记录下来,方便查看。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。