一.從原型到原型鏈
1.一切對(duì)象都是通過new函數(shù)實(shí)例化出來的
2. proto指向的是構(gòu)造出自己的構(gòu)造函數(shù)的原型
person.__proto__ === Person.prototype
補(bǔ)充:
1.constructor屬性:
person.constructor === Person // true
當(dāng)獲取person.constructor時(shí),其實(shí)就是person中并沒有constructor屬性,當(dāng)不能讀取到constructor屬性時(shí),會(huì)從person的原型,也就是Person.prototype中讀取
2.__proto__
實(shí)際上它并不存在于Person.prototype中彼水,它是來源于Object.prototype,與其說是一個(gè)屬性,不如說是一個(gè)getter/setter,當(dāng)使用obj.__proto__時(shí)掀亥,可以理解成返回了Object.getPrototypeOf(obj);
二. 作用域和動(dòng)態(tài)作用域
注意點(diǎn): 當(dāng)執(zhí)行一個(gè)函數(shù)的時(shí)候,就會(huì)創(chuàng)建一個(gè)執(zhí)行上下文妥色,并且壓入執(zhí)行上下文棧搪花,當(dāng)“函數(shù)執(zhí)行完畢”的時(shí)候,就會(huì)將函數(shù)的執(zhí)行上下文從棧中彈出。
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();
兩段代碼執(zhí)行的結(jié)果一樣撮竿,但是兩端代碼究竟有哪些不同呢吮便?
代碼執(zhí)行過程模擬:
1.
ECstack.push(<checkscope> functionContext);
ECstack.push(<f> functionContext);
ECstack.pop()
ECstack.pop()
2.
ECstack.push(<checkscope> functionContext);
ECstack.pop()
ECstack.push(<f> functionContext);
ECstack.pop()
總結(jié):二者的區(qū)別就是在于函數(shù)是否執(zhí)行完畢,如果函數(shù)執(zhí)行完畢就會(huì)立即將函數(shù)的執(zhí)行上下文從棧中彈出幢踏。
--------------------------------------
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
var foo = checkscope();
foo();
這里直接給出簡(jiǎn)要的執(zhí)行過程:
1.進(jìn)入全局代碼髓需,創(chuàng)建全局執(zhí)行上下文,全局執(zhí)行上下文壓入執(zhí)行上下文棧
2.全局執(zhí)行上下文初始化
3.執(zhí)行 checkscope 函數(shù)房蝉,創(chuàng)建 checkscope 函數(shù)執(zhí)行上下文僚匆,checkscope 執(zhí)行上下文被壓入執(zhí)行上下文棧
4.checkscope 執(zhí)行上下文初始化,創(chuàng)建變量對(duì)象搭幻、作用域鏈咧擂、this等
5.checkscope 函數(shù)執(zhí)行完畢,checkscope 執(zhí)行上下文從執(zhí)行上下文棧中彈出
6.執(zhí)行 f 函數(shù)粗卜,創(chuàng)建 f 函數(shù)執(zhí)行上下文屋确,f 執(zhí)行上下文被壓入執(zhí)行上下文棧
7.f 執(zhí)行上下文初始化,創(chuàng)建變量對(duì)象续扔、作用域鏈攻臀、this等
8.f 函數(shù)執(zhí)行完畢,f 函數(shù)上下文從執(zhí)行上下文棧中彈出