JS裡面匿名函式的呼叫 變數作用域的實驗

2021-09-07 07:10:42 字數 2673 閱讀 5571

參考 

已實驗驗證結果正確。

1、下列哪些正確?(b、c)

a.function()();

b.(function())();

c.(function()());

下面也已經實驗驗證結果正確。

2、下列哪個結果是正確的?(a、b、c、d)

a.(function(a1,a2))(1,2);

b.(function(a1,a2)(1,2));

c.void

function(a1,a2)(1,2);

d.var f =function(a1,a2)(1,2);

注:a 、b、c與d四種格式都正確,前兩者屬於同種情況的不同寫法,後兩種是將函式物件的返回值賦給其他變數,c是忽略函式返回值,而d正相反!

下面這個的結果也驗證,但是注意,稍稍改一下,效果就很大差別。

function foo() )();

};var f = new

foo();

結果:123undefined

(1)匿名函式可以直接訪問到外層署名函式(foo)中的變數(使用關鍵字var定義的),但不能訪問外層署名函式的屬性(使用關鍵字this定義的);

稍微改一下,把foo前面的new去掉,直接呼叫foo,如下:

function foo() )();

};var f =foo();

結果:123

456

然後在最後分別加上console.log(f)看看f被賦予什麼內容:

var f = new

foo();

console.log(f);

結果:foo

var f =foo();

console.log(f);

結果:undefined

開始寫自己**的時候,發現了下面的情況。本來以為是node跟原生js的區別呢,看來不是。

用node跑:

123456

3

內部要訪問資料,可以通過傳引數(方法一):

function foo() )(this

);};

var f = new

foo();

結果:123

456

另外,注意下面這種情況:

(function() )();

})();

結果:123

456(1) 匿名函式既可以直接訪問外層匿名函式中的變數,又直接可以訪問外層匿名函式中的屬性,而匿名函式卻不可以直接訪問外層已命名函式中的屬性;

訪問沒有定義過的this.***,也是很有意思的:

結果:123

undefined

789undefined

789後面分析。

再來乙個裡外都是匿名函式的情況:

結果:123

456789

456789

通過上面兩個例子的對比及分析,可以看出如下結論:

(1)匿名函式(即用兩個小括號括起來的部分)位於乙個執行上下文,不論這些**放在哪個位置上。

再比較下面兩種情況:

情況1:

function foo() )();

(function() )();

}var f = new

foo();

(function() )();

結果:789

7890

789789

情況2:

結果:789undefined

0789

789

從以上對比,可以看出:

沒有加 this取值時,如果當前 {} 中不存在同名的區域性變數,則等同於加 this

處理;如果當前 {} 中存在同名的區域性變數,則按常規處理。

上面第二例中,b會列印出undefined,是因為在{}出現了b,並且是在後面出現的,當前還是undefined.

以上,是一些實驗結果。

JS 函式的建立 呼叫 過載 匿名函式

一 函式的建立 1 宣告的方式 function 函式名 形參列表 在程式開始執行前!程式會先將所有var宣告的變數和function宣告的函式,提前到當前作用域的頂部集中建立。而賦值 留在原地。2 賦值方式 var 函式名 function 形參列表 在程式開始執行前,賦值方式可避免函式被宣告提前...

js的函式和匿名函式和作用域

概念 沒有名字的函式 匿名函式的自呼叫 第一種 function 第二種 function 通過函式表示式宣告的函式 函式表示式宣告 var getday function 通過函式表示式宣告的函式,呼叫時,getday 代表返回值 getday 代表的為整個函式體在呼叫函式時,瀏覽器每次會傳遞進兩...

第三章 Js變數的作用域和匿名函式

3.1 先看下面的事例 var temp 0 temp 0 當js解析器檢測到 這種情況的時候,解析器會為這個變數開闢乙個記憶體空間,如果前面已經存在這個變數,就會把這個變數覆蓋掉。當解析器檢測到 這種情況的時候,解析器會尋找當前物件的父級物件有沒有這個變數,以此查詢,只到找到位置 如果還找不到,就...