function sum() {
console.log('hello')
console.log('饑人谷')
}
這是聲明函數各聘,調用就直接:
sum()
另一種聲明方式:
var sum = function() {
console.log('hello')
console.log('饑人谷')
};
sum()
參數:
function sum( a , b) {
console.log( a + b)
return a + b
};
sum( 3 ,4)
得到7。
function sum( a , b ,c) {
console.log( a + b +c)
return a + b
};
sum( 3 ,4)
輸出NaN,因為c是undefined叛氨。而且聲明下,在控制臺的輸出的是console.log的執(zhí)行的功能后展示的內容棘伴。
這里順便聯想了一下寞埠,console.log語句或表達式輸出的內容是這個語句在控制臺的一種功能作用的結果,它相當于控制臺的一個工具焊夸,而這個表達式或語句本身的值是undefined仁连。
而return的才是給讀者的反饋。同時阱穗,return必須放到函數內部怖糊,只有在內部帅容,才可以使參數有意義的。
function say( name,age) {
console.log( name + 'says: I am' +age +'years old')
}
say( '小哥',6)
’小哥says: I am 6 years old'
function say( name,age) {
console.log( name + 'says: I am' +age +'years old')
}
says( 6)
'6 says: I am undefined years old'
6是name的值伍伤,剩下的undefined并徘。
var result =sum( 4 ,6)
function sum(a ,b) {
console.log(a + b)
}
console.log(result)
輸出10,這里是console.log到調試里的顯示結果扰魂,返回值是return的值麦乞。sum沒有返回值,默認為undefined值劝评。console.log(a)是運行顯示了a姐直,但是這句話本身的結果是undefined。
遇到return,后面就完全停了蒋畜。
function fn( score){
if(score < 0){
return
}
console.log(score)
}
fn( -3 )
return 后面沒有賦值声畏,就是返回undefined的意思。
調用時姻成,fn( -3 )
返回undefined,后面不執(zhí)行了插龄。
這個等同于——
function fn(score) {
if(score <0) {
}else {
console.log(score)
}
}
fn(-3)
參數相關和arguments:
function printName () {
var name = arguments[0]
console.log(name)
}
printName('Byron')
還有一種寫法——
function printName(name){
console.log(name);
}
printName('Byron');
第二種是最直接的命名然后就可以用了,邏輯很簡單的科展,第一種是把參數name值通過arguments傳遞了過來均牢,如果這時候沒有賦值,arguments值為undefined輸出為undefined才睹。
聲明提前——
js文件都是順序執(zhí)行的哦徘跪。
變量的:
console.log(a)
console.log(b)
var a=3
執(zhí)行的結果是a輸出undefined不報錯,b輸出undefined報錯了琅攘。
為什么垮庐?var a =3等同于——
var a //這是聲明,規(guī)則是放到所在區(qū)塊的前端坞琴,然后再執(zhí)行哨查。
a = 3
也就是在瀏覽器邏輯解析下,就是這個樣子執(zhí)行:
var a
console.log(a)
console.log(b)
a=3
這樣就明白了吧置济,a現在已經聲明了解恰,但是執(zhí)行console.log時锋八,3的值還沒生效浙于,為undefined,當然把執(zhí)行語句放到a=3后面執(zhí)行挟纱,就可以了羞酗。
b又沒聲明,又沒值紊服。
函數的:
sum(3,5)
function sum(a ,b){
console.log( a + b)
}
這時候運行起來檀轨,得到8胸竞。甚至在sum和函數中間加點語句也會顯示。這里要說参萄,函數聲明跟變量聲明類似卫枝,在執(zhí)行之前,把所有的變量聲明和函數聲明拿到執(zhí)行語句的前面讹挎。
表達式的聲明:
fn()
var fn = function(){
console.log('haha')
}
運行報錯了校赤。為什么?
函數表達式的角度看筒溃,上面的代碼等同于:
var fn
fn()
fn = function(){
console.log('haha')
}
按順序來马篮,fn現在只是聲明了,是undefined,而fn()是把fn當成函數了怜奖,所以報錯了浑测。
立刻執(zhí)行的函數表達式——
(function(){
console.log('haha')
})()
輸出"haha",小括號的優(yōu)先級高,被認為是個值歪玲,一個值加()迁央,被認為是函數。
相當于:
var fn = function(){
console.log('haha')
}
fn ()
命名沖突——
var fn = 3
function fn(){ }
console.log(fn)
等同于
var fn //聲明读慎,fn is undefined
function fn(){ } // fn賦予了函數聲明漱贱,覆蓋了undefined狀態(tài)
fn = 3 // 3的值賦予到a,這個操作才是最終的結果
console.log(fn) // 3
function fn(){ }
console.log(fn)
var fn = 3
等同于:
function fn(){ } //聲明,fn不僅有了var fn的意義夭委,更進一步添加了函數的內在身份
var fn //聲明 幅狮,無所謂影響了,最
console.log(fn) // function fn(){ }
fn = 3 // 賦值
function fn(fn ){
console.log( fn )
var fn = 3
console.log( fn )
}
fn(10)
如果出現了參數與函數命名重復了怎么辦株灸?假設一個arguments[0]崇摄。
變成如此:
function fn( ){
var fn = arguments[0] //這時候把10賦予過來了
console.log( fn ) // 輸出10
var fn = 3 //3覆蓋掉10的值
console.log( fn ) //輸出3
}
fn(10) //10,3
這里就有些類似于我高考的數學變形題目了,fn(fn)跟fn(10)的關系就是得到了現在fn=10慌烧,回歸到函數內部逐抑,就還有一個語句運行環(huán)境的觀念,千萬不要想當然屹蚊,整個函數運行起來厕氨,fn=10適用于所有語句了。能說它嵌套嗎汹粤?也不算命斧。
遞歸函數——
function fn(n ){
if (n ==1){
return 1
} // 限制n為1時的0或者出現負數
return n*fn(n-1) //這是表達式
}
fn (4) //24,就是1*2*3*4
效率低嘱兼,需要計算1,2,3,4,的国葬,算4次,就是邏輯清晰簡單而已。
作用域——————
{
var a = 3
}
console.log(a) //1汇四,也沒報錯接奈,直接寫大括號沒作用域
js里沒有塊級作用域。
循環(huán):
for(var i =0; i<10; i++){
var a = 3
}
console.log(a) //3,這里的意思就是循環(huán)語句里的變量作用于全局的通孽,也就是沒有作用域序宦,包括里面的i。當然循環(huán)語句會聲明前置到代碼頂部背苦。
這里很容易混淆挨厚,因為重點就是講函數的作用域的。
function fn(){
var a =1
if (a>2){
var b =3
}
console.log(b)
}
fn()//1<2糠惫,直接運行后面的console.log(b),b沒聲明疫剃,undefined
console.log(a)// 報錯了,因為函數作用域硼讽,a是函數內部變量巢价,全局里沒有它。
這里的意思就是變量都是有作用區(qū)域的固阁,聲明區(qū)域多大壤躲,它的意義就發(fā)揮在多大空間,跟數學函數的自變量的范圍差不多备燃。函數內的變量只能有意義在這個函數內部碉克,那全局變量對函數本身內部呢?
function fn(){
a = 2
}
fn()
console.log(a)//2并齐,不寫var去聲明變量漏麦,就是全局的性質,外部可以用它了况褪。所有以后聲明變量一定要邏輯清晰撕贞,慎重。在最外層寫全局的测垛,能寫var就寫上捏膨。
函數和作用域
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來效五,“玉大人地消,你說我怎么就攤上這事∥费” “怎么了脉执?”我有些...
- 正文 為了忘掉前任巫橄,我火速辦了婚禮,結果婚禮上茵典,老公的妹妹穿的比我還像新娘湘换。我一直安慰自己,他們只是感情好统阿,可當我...
- 文/花漫 我一把揭開白布彩倚。 她就那樣靜靜地躺著,像睡著了一般扶平。 火紅的嫁衣襯著肌膚如雪帆离。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼王悍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了餐曼?” 一聲冷哼從身側響起压储,我...
- 正文 年R本政府宣布,位于F島的核電站帆疟,受9級特大地震影響鹉究,放射性物質發(fā)生泄漏。R本人自食惡果不足惜踪宠,卻給世界環(huán)境...
- 文/蒙蒙 一自赔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柳琢,春花似錦匿级、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肖粮,卻和暖如春孤页,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涩馆。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 閉包在JavaScript 中是一個非常重要的概念精刷。 閉包例子 outer函數是一個函數聲明,有一個局部變量loc...
- 函數是一塊JavaScript代碼,被定義一次锈遥,但可執(zhí)行調用多次纫事,js中的函數也是對象勘畔,所以js函數可以像其他對象...
- 1.函數聲明和函數表達式有什么區(qū)別 (*) 區(qū)別: 函數聲明后面的分號可加可不加,不加也不影響接下來語句的執(zhí)行丽惶,但...