1. 程式人生 > >什麽是作用域鏈,什麽是原型鏈,它們的區別,在js中它們具體指什麽?

什麽是作用域鏈,什麽是原型鏈,它們的區別,在js中它們具體指什麽?

function fun 創建 原型鏈 變量 pro pos bject prototype

作用域是針對變量的,比如我們創建了一個函數,函數裏面又包含了一個函數,那麽現在就有三個作用域

  全局作用域==>函數1作用域==>函數2作用域

作用域的特點就是,先在自己的變量範圍中查找,如果找不到,就會沿著作用域往上找。

如:

var a = 1;
function b(){
    var a = 2;
    function c(){
        var a = 3;
        console.log(a);
    }
    c();
}
b();

最後打印出來的是3,因為執行函數c()的時候它在自己的範圍內找到了變量a所以就不會越上繼續查找,如果在函數c()中沒有找到則會繼續向上找,一直會找到全局變量a,這個查找的過程就叫作用域鏈。

不知道你有沒有疑問,函數c為什麽可以在函數b中查找變量a,因為函數c是在函數b中創建的,也就是說函數c的作用域包括了函數b的作用域,當然也包括了全局作用域,但是函數b不能向函數c中查找變量,因為作用域只會向上查找。

那麽什麽是原型鏈呢?

  原型鏈是針對構造函數的,比如我先創建了一個函數,然後通過一個變量new了這個函數,那麽這個被new出來的函數就會繼承創建出來的那個函數的屬性,然後如果我訪問new出來的這個函數的某個屬性,但是我並沒有在這個new出來的函數中定義這個變量,那麽它就會往上(向創建出它的函數中)查找,這個查找的過程就叫做原型鏈。

  Object ==> 構造函數1 ==> 構造函數2

  就和css中的繼承一樣,如果自身沒有定義就會繼承父元素的樣式。

function a(){};
a.prototype.name = "追夢子";
var b = new a();
console.log(b.name); //追夢子

什麽是作用域鏈,什麽是原型鏈,它們的區別,在js中它們具體指什麽?