函數(shù)的聲明方式:
function fn(){} //具名函數(shù)
var f = function (){} //匿名函數(shù),必須將其賦給一個變量,這種形式稱為函數(shù)表達(dá)式
var f = fucntion fn(){} //具名函數(shù)台丛,函數(shù)表達(dá)式
var f = new Function('x', 'y', 'return x+y') //構(gòu)造函數(shù)聲明,最不常用
var f = ()=>{} //箭頭函數(shù)
//對于var f = fucntion fn(){}這種形式的变汪,只能通過f()調(diào)用
var f = function fn(){console.log('hello')}
fn() //報錯
f() //hello
函數(shù)的本質(zhì)
請看下面代碼
//這是一個求三角形面積的函數(shù)
function area (width, height){
s = width*hegiht.2
return s
}
當(dāng)我們每次需要求三角形面積的時候,調(diào)用這個函數(shù)即可番官,需要就用
所以徘熔,函數(shù)的本質(zhì)就是可以反復(fù)調(diào)用的代碼塊近顷,并且可以接受參數(shù)缀遍,結(jié)果會根據(jù)參數(shù)的不同而改變
this域醇、arguments
this表示屬性當(dāng)前所在的對象
var obj = {
n: 1,
fn: function(){
console.log(this.n)
}
}
obj.fn() //1
obj.fn,call(obj) //1
obj.fn.call() //undefined
var n = 2
obj.fn.call() //2
call可以改變this的指向,this就是call的第一個參數(shù)酪呻,在非嚴(yán)格模式下贼邓,call的第一個參數(shù)為空或?yàn)閡ndefined塑径,this默認(rèn)指向window
function fn(){
console.log(this)
console.log(this === window)
}
fn.call()
//Window {postMessage: ?, blur: ?, focus: ?, close: ?, frames: Window, …}
//true
在嚴(yán)格模式下,call的第一個參數(shù)是什么this就是什么
function fn(){
'use strict'
console.log(this)
console.log(this === window)
}
fn.call()
//undefined
//false
fn.call(123)
//123
//false
arguments就是函數(shù)接收的參數(shù),是一個偽數(shù)組枢泰,因?yàn)樗脑玩湜]有Array.prototype這一環(huán)
function f(){
console.log(arguments)
}
fn(1,2,3,4) //Arguments(4) [1, 2, 3, 4, callee: ?, Symbol(Symbol.iterator): ?]
作用域窿克、變量提升
每個函數(shù)都有自己單獨(dú)的作用域年叮,并且在函數(shù)內(nèi)部也會發(fā)生變量提升。
函數(shù)內(nèi)部的變量提升
- var命令聲明的變量七咧,不管在什么位置爆存,變量聲明都會被提升到函數(shù)體的頭部
函數(shù)作用域問題
- 若一個函數(shù)內(nèi)部有子函數(shù),代碼如下
var a = 1
function f1(){
var a = 2
console.log(a) //優(yōu)先在f1范圍內(nèi)查找a悼粮,若找不到a向上查找(也就是全局范圍)菜循,不會想下查找
f2()
function f2(){
var a = 3
console.log(a)
}
}
f1() //2 3
console.log(a) //1
此時的作用域是這樣的:
image.png