变量赋值

变量赋值分为两个动作:

  1. 如果当前没有声明过,那编译器会在当前作用域声明一个。

  2. 运行时引擎会在作用域查找该变量,如果找到就对其赋值。

查询有: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

  1. 函数是否在new中调用?如果是,this绑定的是新创建的对象。

  2. 函数是否通过call、apply或者硬绑定?如果是,this绑定的是指定的对象。

  3. 函数是否在某个上下文中调用?如果是,this绑定上下文对象。

  4. 如果都不是,使用默认绑定。严格模式绑定到undefined,否则为全局对象。

  5. foo.call(null) 使用默认绑定规则。

  6. 箭头函数的绑定是无法被修改的(不适用于前4条规则),继承外层函数调用的this绑定。

属性描述符

  1. writeable:属性的值是否可以修改。

  2. configable:属性的值可配置。如果是可以配置的,那么就可以使用defineProperty()方法来修改属性描述符。这种设置为单向,不可取消。意思是可以从true到false,但是不能从falsetrue。如果值为false则禁止删除这个属性。

  3. enumerable:是否为可枚举的。如果是false那么在使用for...in的时候不会出现。

PS:今天看到本子上随意写的,记录下来,方便查看。


silence
386 声望26 粉丝

我就是我,是不想绽放的烟火!