javascript基礎 函式表示式

2021-08-28 22:58:20 字數 2422 閱讀 9013

函式宣告與函式表示式的區別:

函式宣告提公升:就是使用函式宣告時,函式會被解析器先讀取,以供執行環境使用,所以函式宣告的位置可以在函式呼叫的後面

函式表示式則不可以在函式呼叫的前面,必須先定義函式表示式,才可以呼叫,不然瀏覽器會報錯。

函式表示式:

var sayhi = function(name)

sayhi("john")

函式表示式建立的是乙個匿名函式。然後將匿名函式賦值給乙個變數,通過變數來呼叫。

(function(name))("john")

(function(name)("john"))

這兩種執行方式效果是相同的,是立即執行的意思,定義完之後直接執行,而不需要通過乙個變數+()來呼叫。

閉包:按照高程裡面的描述就是:乙個函式可以訪問另外乙個函式作用域裡面的變數。

function outersum(a,b)

return sum;

}var result = outersum(1,2)

result() // 3

函式呼叫時發生的事情:

首先會建立乙個執行環境和相應的作用域鏈,然後使用arguments和其他命名引數的值來初始化函式的活動物件。然後外部函式的活動物件始終是第二個。

這是最簡單的閉包,sum內部函式可以獲取outersum外部函式的活動變數。當outersum執行完畢之後,它的執行環境被銷毀了,但是它的活動物件依然在記憶體中,沒有被銷毀,因為匿名函式依然在引用著這些變數。直到匿名函式被銷毀,它的活動物件才會被銷毀。

閉包的缺點:

function a() 

}return arr

}var b = a()

b[0]() //10

b[1]() //10

b[2]() //10

閉包只能取得包含函式中任何變數的最後乙個值。比如這個例子。程式中先執行a(),這個函式,但是b()並沒有被呼叫。直到執行到return arr這條語句,a()已經執行完成,然後接下來繼續往下執行,就是b[0]()這個方法,但此時i=10,所以列印出來的都是10。可以把匿名函式設定為立即執行函式,這樣就可以解決這個問題了。

function a()      

}(i)

}return arr

}var b = a()

b[0]() //0

b[1]() //1

b[2]() //2

關於this物件

var name = 'the window'

var object =

}}console.log(object.getnamefunc()()) //the window

這裡相當於:

var a = object.getnamefunc()

console.log(a())

這裡的a()是在全域性作用域下呼叫的,並且不是dot呼叫,所以this就指向window。只要函式中指定this的值就可以了。

var name = 'the window'

var object =

}}console.log(object.getnamefunc()()) // my object

var name = 'the window'

var object = .bind(object)()

}}console.log(object.getnamefunc())

console.log(object.getnamefunc().call(object))

只要修改this的值是指向object就可以返回object裡面的值。

模仿塊級作用域:

(function () ) ()
這是乙個立即執行函式,模仿塊級作用域,其他作用域無法訪問這個作用域。

function()  () // 錯誤的寫法
這是個函式宣告,函式宣告後面加括號是錯誤的做法,函式宣告後面不能加圓括號。只有函式表示式才可以。我們只要給函式宣告用圓括號括起來,那麼就可以轉換為函式表示式。就像上面的形式那樣。

優點:模仿塊級作用域可以減少閉包占用的記憶體問題,因為沒有指向匿名函式的引用,只要函式執行完畢,就可以立即銷毀其作用域鏈。

模組模式:

為單例建立私有變數和特權方法。所謂的單例,指的就是只有乙個例項的物件。

var singleton = function() 

return

}}();

如果必須建立乙個物件並以某些資料對其進行初始化,同時還要公開一些能夠訪問這些私有資料的方法,那麼就可以使用模組模式。

javascript函式基礎 this基礎

this是函式體內自帶的乙個物件指標,它能夠始終指向呼叫物件 這個this代表的物件由this所在的執行作用域決定的,而不是根據this所在的定義作用域決定。this 屬性 如果this未包含屬性,則直接傳遞的是當前物件 1.this代表當前操作物件 this即代表 物件input 2.this代表...

JavaScript函式宣告和函式表示式

1.function func 函式宣告 2.var fn function 函式表示式宣告的一種 在js中函式宣告和大部分語言一樣很好理解。但不能為匿名函式,即 function 會報錯。正確的宣告方式為 function func js中函式表示式的宣告方式不止上面的一種方式.最常見的還有下面的...

Javascript學習筆記3 函式表示式 閉包

函式宣告提公升 執行 之前會先讀取函式宣告 但是使用函式表示式命名定義函式時,使用前必須賦值 sayhi 錯誤,函式還未賦值 var sayhi function 是指有權訪問另乙個函式作用域中的變數的函式 當建立函式時,會建立乙個預先包含全域性變數物件的作用域鏈。作用域鏈本質上是乙個指向變數物件的...