幾句話帶你理解JS中的this、閉包、原型鏈
原型鏈
所有對象都是基于Object.prototype,Object.prototype就是JavaScript的根對象,在Object.prototype中定義的方法都可以被其它對象訪問到,當(dāng)然也可以被重寫了,所以直接在Object.prototype上調(diào)用的是原始功能的toString()方法,該方法會放回參數(shù)對象的內(nèi)置屬性[[class]]的值,這個值是個字符串,比如'[Object String]'
要理解原型鏈機制的話,首先得知道根本原因:JavaScript中的對象都有一個內(nèi)置屬性[[Prototype]],這個屬性和非標(biāo)準(zhǔn)的__proto__屬性一樣,__proto__在ES6中被納入標(biāo)準(zhǔn)了,可以說它們基本上是等價的,但內(nèi)置屬性是無法訪問到的。對象之間通過內(nèi)置屬性[[Prototype]]關(guān)聯(lián)了起來就形成了原型鏈,而原型鏈的頂層就是根對象Object.prototype,Object.prototype的原型將是null,即Object.prototype.__proto__ === null;
例如:
在訪問對象的屬性的時候,如:obj.a,首先查找自身,沒有,就到它的內(nèi)置屬性[[Prototype]]所引用的對象上找,還是沒有,就繼續(xù)在這個上層對象的內(nèi)置屬性[[Prototype]]所引用的對象上找,一直找到根對象Object.prototype,找不到就返回undefined;
this
理解this的第一步就是要明白:this既不指向函數(shù)自身,也不指向函數(shù)的詞法作用域;
this是在運行時進行綁定的,而不是在編寫時綁定,它的上下文取決于函數(shù)調(diào)用時的各種條件;
this的綁定和函數(shù)聲明的位置沒有任何關(guān)系,只取決于函數(shù)的調(diào)用位置和調(diào)用方式;
this綁定規(guī)則有4點:按優(yōu)先級1到4判斷
1.由new調(diào)用?綁定到新創(chuàng)建的空對象;
2.由call、apply、bind調(diào)用?綁定到指定的參數(shù)對象;如foo.call(obj)
3.由上下文對象調(diào)用?綁定到這個上下文對象;如obj.foo()
4.默認(rèn)情況下綁定到全局對象,foo();在嚴(yán)格模式下綁定到undefined;
閉包
function foo(){
var a = 2;
function bar(){}
return bar;
}
var a = foo();
a();
閉包:不是指函數(shù)bar也不是a,它是一個引用,這個引用被內(nèi)部函數(shù)bar持有,這個引用指向外部函數(shù)foo的整個作用域,它使得這個作用域即使在外部函數(shù)foo()執(zhí)行后也不會被垃圾回收器回收。也就是說這個外部函數(shù)foo的作用域就是閉包本身。
無論通過何種手段(直接或間接)將內(nèi)部函數(shù)傳遞到所在的詞法作用域以外,它都會持有對原始定義作用域的引用,無論在何處執(zhí)行這個函數(shù)都會使用閉包。
var fn; //間接傳遞函數(shù)
function foo(){
var a = 2;
function baz(){
console.log(a);
}
fn = baz;
}
function bar(){ fn();}
foo();
bar(); function foo(){
var a = 2;
function baz(){
console.log(a);
}
bar(baz);
}
function bar(fn){ fn(); }
相關(guān)文章
javascript之Partial Application學(xué)習(xí)
在數(shù)學(xué)中,一個函數(shù)是描述每個輸入值對應(yīng)唯一輸出值的這種對應(yīng)關(guān)系,符號為 f(x)。例如,表達(dá)式 f(x)=x2表示了一個函數(shù) f,其中每個輸入值x都與唯一輸出值x2相聯(lián)系2013-01-01
JS獲取DropDownList的value值與text值的示例代碼
本篇文章主要是對JS獲取DropDownList的value值與text值的示例代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01
使用JS的input框?qū)崿F(xiàn)音頻文件的上傳與播放功能
最近的系統(tǒng)加的功能是越來越多了,前兩天老板又讓實現(xiàn)一個錄音上傳的功能,可以點擊播放按鈕打開音頻播放器,點擊暫停按鈕暫定播放,想了想決定使用input框的file類型加上接收的參數(shù)為audio來實現(xiàn)此功能,感興趣的朋友可以參考下2024-06-06
從JQuery源碼分析JavaScript函數(shù)的apply方法與call方法
這篇文章主要介紹了從JQuery源碼分析JavaScript函數(shù)的apply方法與call方法,本文結(jié)合JQuery源碼和js高級程序設(shè)計再次探究apply方法與call方法,需要的朋友可以參考下2014-09-09

