js中var self this的解釋

2021-08-01 09:46:54 字數 1505 閱讀 1211

每個函式在定義被ecmascript解析器解析時,都會建立兩個特殊的變數:this和arguments,換句話說,每個函式都有屬於自己的this物件,這個this物件是在執行時基於函式的執行環境繫結的,即在全域性物件中,this指向的是window物件;在自定義函式中,this物件指向的是呼叫這個函式的物件,

也就是說,this指向的是呼叫執行環境的那個物件。

如果是在函式巢狀環境中,this指代的是呼叫外部函式或者內部函式的執行環境的物件;

看例子吧:

/*----- 2014-2-10 這個例子是錯誤的 -----*/

function basetype(name,age)

this.saysomething=function()

//通常用法:將上下文this快取到乙個變數中

//以便在本函式作用域內包含另乙個函式作用域的情況下可以繼續使用此上下文物件this

//如果省略var self=this;這行,那麼在巢狀函式作用域內就無法訪問到本函式作用域的成員了。          }

}var b1=new basetype("wede",30);

b1.saysomething(); //my name is wede, and i'm 30years old. 

從結果來看,是預期的結果。

那麼這裡可能又會出現新的疑問:為什麼在saysomething()方法中非要用self.sayhello()來呼叫呢,

直接sayhello()多好?

其實這又涉及到另乙個話題:例項成員與區域性成員。

我們建立建構函式的意義就是要用它來建立例項,那麼所有屬於例項的成員都需要用this來定義;

而只有那些不屬於例項的成員才不會用this定義;

當然,用this定義了方法以後,在函式作用域內部要呼叫此方法時,就需要加上this了。

為了證明這一點,來看下面的**:

function basetype(name,age)

this.saysomething=function()

}var b1=new basetype("wede",30);

b1.saysomething(); //referenceerror: sayhello is not defined

結果顯示:sayhello方法未定義。

就是說明,我們呼叫的其實是區域性方法sayhello,而現在只有例項方法sayhello,所以會出現異常。

下面來改裝下(注意加粗的部分):

function basetype(name,age)

this.saysomething=function()

}var b1=new basetype("wede",30);

b1.saysomething();//my name is wede, and i'm 30years old.

可以看出,輸出了預期的結果。

而這時候,我們把sayhello方法變成了乙個區域性方法(對於例項不可見),然後再在saysomething方法中呼叫就可以了。

關於困惑已久的var self this的解釋

this.name name this.age age this.sayhello function this.saysomething function 詳見 var b1 new basetype wede 30 b1.saysomething my name is wede,and i m 3...

JS 理解JS中的物件

物件是object資料型別的值 物件是一組沒有特定順序的值 其中每個值都有乙個名字,從而,物件看起來就像是一組名值對。建立並定義物件的方法 1.var person new object person.name carolina person.age 29 person.job dream pers...

js中的函式

1 js中的string物件 1 內建的 2 屬性 length 3 方法 indexof 查詢子字串 匹配字串 查詢到了,返回 字串 出現的位置 沒有找到 返回 1 charat 返回指定位置的字串 substr 字串的擷取,可加兩個引數,形如 2,2 第二個位置 長度 也可以是乙個引數,則表示從...