函數和作用域

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就寫上捏膨。













最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市食侮,隨后出現的幾起案子号涯,更是在濱河造成了極大的恐慌,老刑警劉巖锯七,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件链快,死亡現場離奇詭異,居然都是意外死亡起胰,警方通過查閱死者的電腦和手機久又,發(fā)現死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來效五,“玉大人地消,你說我怎么就攤上這事∥费” “怎么了脉执?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長戒劫。 經常有香客問我半夷,道長,這世上最難降的妖魔是什么迅细? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任巫橄,我火速辦了婚禮,結果婚禮上茵典,老公的妹妹穿的比我還像新娘湘换。我一直安慰自己,他們只是感情好统阿,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布彩倚。 她就那樣靜靜地躺著,像睡著了一般扶平。 火紅的嫁衣襯著肌膚如雪帆离。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天结澄,我揣著相機與錄音哥谷,去河邊找鬼。 笑死麻献,一個胖子當著我的面吹牛呼巷,可吹牛的內容都是我干的。 我是一名探鬼主播赎瑰,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼王悍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了餐曼?” 一聲冷哼從身側響起压储,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎源譬,沒想到半個月后集惋,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡踩娘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年刮刑,在試婚紗的時候發(fā)現自己被綠了喉祭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡雷绢,死狀恐怖泛烙,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情翘紊,我是刑警寧澤蔽氨,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站帆疟,受9級特大地震影響鹉究,放射性物質發(fā)生泄漏。R本人自食惡果不足惜踪宠,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一自赔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柳琢,春花似錦匿级、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肖粮,卻和暖如春孤页,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涩馆。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工行施, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魂那。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓蛾号,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涯雅。 傳聞我的和親對象是個殘疾皇子鲜结,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容