js易漏点

函数是一种特殊的对象,可以被调用。

V8引擎内部会给每个函数添加两个属性name:函数名(匿名函数name:anonymous),code:函数代码字符串。

函数是一等功名(first clss function)

可赋值、可作为参数,可当返回值

V8中对象存储结构

在 V8 中,对象主要由三个指针构成,分别是隐藏类(Hidden Class),Property 还有 Element

Property 与 Element

可索引的属性应该按照索引值大小升序排列,而命名属性根据创建的顺序升序排列。

具体参见

简言之,数字属性按照索引值大小升序排列,字符串按创建时间升序排列

小于10的字符串属性,直接存在对象中,否则超过10的部分存在Property中

函数表达式

函数声明和函数表达式

image.png

v8是如何处理的?

编辑阶段,将所有变量提升到作用域。遇到普通变量,变量提升阶段赋值undefined,如果是变量声明,V8在内存中为声明生成函数对象。


表达式和语句

表达式执行,而语句用于声明

思考:

function DogFactory(name,color){
    this.name=name
    this.color=color
}
复制代码

DogFactory.__proto__DogFactory.prototype的区别?

DogFactory.prototype是dog实例的原型对象

DogFactory.__proto__指向Function.prototype
function DogFactory等于
new Function(['name','age'],'this.name=name;this.color=color')

原型链和作用域链

思考下面type会打印什么

var name = "dog";
var type = "animal";

function bar() {
  var name = "foo";
  var type = "bar_type";
  foo();
}

function foo() {
  var name = "cat";
  console.log("type", type);
  console.log("name", name);
}

foo();
复制代码

作用域链会顺着bar->全局寻找,还是直接在全局中寻找?

!!!作用域在函数定义的确定!!!
词法作用域根据函数在代码中的位置确定,作用域是在函数声明是就确定了的,词法作用域===静态作用域。
btw,动态作用域,函数调用时确定。

类型转化

image.png

const obj = {
  valueOf(){
    return 100
  },

  toString(){
    return '1'
  }
}

obj+1 // 返回101
obj+'1' // 返回'1001'

复制代码

如果valueOf和toString() 都返回对象,则抛出类型错误

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享