函数是一种特殊的对象,可以被调用。
V8引擎内部会给每个函数添加两个属性name
:函数名(匿名函数name:anonymous),code
:函数代码字符串。
函数是一等功名(first clss function)
可赋值、可作为参数,可当返回值
V8中对象存储结构
在 V8 中,对象主要由三个指针构成,分别是隐藏类(Hidden Class),Property 还有 Element
Property 与 Element
可索引的属性应该按照索引值大小升序排列,而命名属性根据创建的顺序升序排列。
简言之,数字属性按照索引值大小升序排列,字符串按创建时间升序排列
小于10的字符串属性,直接存在对象中,否则超过10的部分存在Property中
函数表达式
函数声明和函数表达式
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,动态作用域,函数调用时确定。
类型转化
const obj = {
valueOf(){
return 100
},
toString(){
return '1'
}
}
obj+1 // 返回101
obj+'1' // 返回'1001'
复制代码
如果valueOf和toString() 都返回对象,则抛出类型错误
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END