JavaScript函數口試考點比較麋集參考阮一峰JavaScript函數我的博客:關於作用域,變量提拔,函數提拔的個人明白筆記1.函數的五種聲明體式格局1.1簽字函數var聲明一
Javascript函數
口試考點比較麋集
參考阮一峰Javascript函數
我的博客:關於作用域,變量提拔,函數提拔的個人明白筆記
1.函數的五種聲明體式格局
1.1 簽字函數
var
聲明一個變量,七種數據範例
function
聲明一個函數,是個慣例
不寫return
自動加上return undefined
function f(x,y){
return x+y
}
f.name // 'f'
1.1.1 關於console.log()
-
console.log()
返回undefined
-
console.log()
會在傳入的參數里起首挪用toString()
要領
- 然則當打印到控制台的時刻,沒有寫雙引號,是chrome瀏覽器的緣由
- 比方能夠在重寫
console.log()
1.2 匿名函數
var f
f = function(x,y){
return x+y
}
f.name // 'f'
假如要聲明匿名函數,就肯定要把它賦給一個變量
1.3var x = function y(){}
var f
f = function f2(x,y){ return x+y }
f.name // 'f2'
console.log(f2) // undefined
直接聲明function y(){}
與var x = function y(){}
的區分
然後革新頁面
直接報錯,說y沒有定義
區分:
第一種體式格局能夠打印,第二種打印說不存在.
第一種全部表面的地區都能夠接見y,第二種只要函數內部才能夠接見到y.(能夠接見的地區就是綠色圈起來的地區)
1.4 window.Function
window.Function
var f = new Function('x','y','return x+y')
f.name // "anonymous"
基礎不會用
1.5 箭頭函數
箭頭函數都是匿名函數,沒有名字,就像是匿名函數的簡寫情勢
三種
箭頭函數
var f = (x,y) => {
return x+y
}
var sum = (x,y) => x+y//假如return只要一個,能夠省略return和{}
var n2 = n => n*n//假如參數只要一個,能夠省略()
五種體式格局總結
2.函數的name屬性
一切的函數都有一個name屬性,他是一個字符串
1簽字函數
function f(x,y){
return x+y
}
f.name // 'f'
2匿名函數
var f
f = function(x,y){
return x+y
}
f.name // 'f'
3簽字函數賦值
var f
f = function f2(x,y){ return x+y }
f.name // 'f2'
console.log(f2) // undefined
4window.Function
var f = new Function('x','y','return x+y')
f.name // "anonymous"
5箭頭函數
var f = (x,y) => {
return x+y
}
f.name//"f"
3.函數的實質
3.1函數的挪用
挪用的英文單詞call
函數在內存中為字符串
3.1.1函數在內存中:
即函數也是一個對象,廣義上
3.1.2 eval()函數
給一個字符串.返回的為:字符串轉化成代碼然後實行.’
3.1.3函數就是對象
模仿函數實質
函數是一個對象,內里有參數,函數體,挪用要領
f是函數,是對象,f.call()是一個實行函數體的要領
總結
js中有七種數據範例,
number string boolean null undefined
symbol **object**
前六種是簡樸範例,object是前6種的種種組合,所以是龐雜範例
原型鏈
3.1.4函數的挪用:f(1,2)
與f.call(undefined,1,2)
f(1,2)
是簡樸用法
f.call(undefined,1,2)
才是實在的用法
用call 便於明白this,是硬核手藝
call用法:
參數從第二個最先
4.this
和arguments
arguments是參數數組
4.1 this
慣例:當call()
的第一個參數是undefined
的時刻, this
是 window
.
當啟用嚴厲形式的時刻,call
里的第一個參數是什麼,this
就是什麼
this的作用先不說
4.2 arguments
是參數構成的偽數組
偽數組:內里有0123這些序次,也有length,長得像數組,然則.偽數組的__proto__
沒有指向的是 Array.prototype
,或者說原型鏈中沒有Array.prototype
,即原型鏈中沒有和Array.prototype
有關的 ,也就是說只是一個像數組的對象罷了.
沒有 push
5 call stack 挪用棧
每進入一個函數,就在棧里紀錄一個暗號,當挪用完以後return的時刻,就跳到做的暗號那裡,彈出棧里的暗號
挪用演示:
一般挪用
嵌套挪用
遞歸挪用
5.1 Stack Overflow
毛病
客棧溢出
超越call stack挪用棧
segment fault也是一種毛病,c言語內里的
6. 作用域
什麼情況下直接運用 a=1
會使a直接變成全局變量(window.a
)?
當寫a=1
這個代碼的時刻,起首盤算時機以為這是賦值,當發明當前作用域沒有聲明a
的時刻,就繼承往上找,看看上一層的作用域有無聲明a
,就這樣,一向找到window
層即全局作用域層,就直接給全局變量window
自動聲明一個a.
就近準繩,哪個scope離賦值近來,賦值的就是哪個作用域
我的博客:關於作用域,變量提拔,函數提拔的個人明白筆記
這個f4內里的a只能是他自身自身的作用與和他的父作用域,跟f1內里的a沒有關係
f4打印出來的a是1
一切的代碼剖析終了,這時刻i已是6.
所以當點擊的時刻,已是剖析終了后的i,點擊的時刻就是實行最最先綁定過的函數,點擊相當於在末了寫下實行函數的代碼,這時刻i已是6了,所以打印出來的是6.for輪迴完畢以後就是6.
liTags[i].Onclick= function(){
console.log(i)
}//在這裏只是聲明函數,並沒有挪用,運轉這段代碼只會剖析代碼,不會運轉函數
//當點擊事宜發作的時刻,就相當於挪用這個函數,當挪用的時刻,已被剖析成6了點擊速率不可能凌駕剖析速率
同理,下面代碼打印出的是6
閉包定義
問題
慣例:當call()
的第一個參數是undefined
的時刻, this
是 window
.