雜七雜八的前端基礎01 函式作用域

2021-09-11 14:18:03 字數 2051 閱讀 7521

首先我們來宣告乙個js物件person:

var person = 

};複製**

然後呼叫person物件的talk方法:

person.talk();

複製**

結果如下:

沒有任何問題,然後我們將person物件的talk方法賦值給乙個全域性變數talk,並呼叫這個全域性的talk方法:

var talk = person.talk;

talk();

複製**

結果如下:

和之前的執行結果相同。

現在我們來給person物件新增屬性name和方法sayname,修改之後的person物件如下:

var person = ,

sayname

() }

複製**

呼叫person物件的sayname方法:

person.sayname();

複製**

結果如下:

沒有任何問題,輸出的name是person物件的name屬性,然後我們將person物件的sayname方法賦值給乙個全域性變sayname,並呼叫這個全域性的sayname方法:

var sayname = person.sayname;

sayname();

複製**

結果如下:

我們發現此時沒有找到name,輸出undefined,這是由於我們呼叫sayname方法時,是在全域性作用域下呼叫的該方法,對比一下:

//呼叫person物件的sayname方法:

person.sayname();

呼叫全域性的sayname函式,瀏覽器環境下相當於呼叫:

window.sayname();

複製**

而此時頂級物件window下並沒有name屬性,所以輸出undefined

我們再拓展一下,如果在定時器中使用this是指向什麼作用域呢?、 在person物件中新增乙個方法saynamelater,修改之後的person物件如下:

var person = ,

sayname

() ,

saynamelater

() ,1000);

}}複製**

呼叫person物件的saynamelater方法:

person.saynamelater();

複製**

結果如下:

我們發現此時沒有找到name,輸出undefined,這是由於我們在使用定時器時,函式中的this會指向window物件(瀏覽器環境下),如果我們此時宣告全域性變數name並賦值:

var name = "xiaohong";

複製**

再呼叫person物件的saynamelater方法:

person.saynamelater();

複製**

結果如下:

使用定時器時,函式中的this會指向window物件,即使我們使用物件方法而不是函式,this依然會指向window物件。現在person物件不變,全域性變數name不變,在定時器中呼叫person物件的sayname方法:

var name = "xiaohong";

var person = ,

sayname

() ,

saynamelater

() ,1000);

}}settimeout(person.sayname, 1000);

複製**

結果如下:

可以看到使用的仍然是全域性變數name,這是由於計時器在解析第乙個引數的時候使用eval執行,相當於我們最開始說的,將函式的方法賦值給乙個變數,並執行該變數方法,所以作用域依然是全域性。

雜七雜八的

有一些常用的表示式的對應元 如下表 型別 元 注釋 注釋 array type comment value 注釋 注釋段 注釋第一行 注釋第二行 array type comments value 注釋第一行 注釋第二行 退出exit exit 200 array type exit array t...

C C 的雜七雜八

1.includebit stdc h是gcc中的乙個神奇的庫,它包含了幾乎所有的c 標準庫。2.templatevectorsplitstr const string s 這段 將s中以空格分隔的資料提取出來,以t型別儲存到vector中。istringstream 是以string作為buf,o...

雜七雜八的感受

關於一位大神的分享 1.不要忘記你的熱情 2.主動 主動 還是主動 3.今天不發生,明天也不會發生 4.有深度才會有廣度,廣度是深度的衍生品 5.如果你像大多數人一樣思維,你也會成為大多數人,如果你對此不介意,那也沒什麼問題 6.在你問問題前,請先搞明白你的問題的根源是什麼,你要解決什麼問題 關於職...