1:函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
- 函數(shù)聲明必須有標(biāo)識(shí)符,也就是常說(shuō)的函數(shù)名;函數(shù)表達(dá)式可以省略函數(shù)名。
函數(shù)聲明(要帶標(biāo)識(shí)符)
function fnName(arg1, arg2, ...)
函數(shù)表達(dá)式
- 省略標(biāo)識(shí)符:
var variable=function(arg1, arg2, ...)
- 帶有標(biāo)識(shí)符:
var variable=function functionName(arg1, arg2, ...)
- 函數(shù)聲明會(huì)提前
sayHello();<!-- 函數(shù)聲明 -->
function sayHello () {
alert ('HELLOJIRENGU.');
}
sayHello();<!-- 函數(shù)表達(dá)式 -->
var sayHello = function () {
alert ('myname is jrg');
}
即函數(shù)聲明的話sayTruth()可以提前調(diào)用,而函數(shù)表達(dá)式是什么時(shí)候遇到什么時(shí)候執(zhí)行
2:什么是聲明前置
變量聲明前置就是在js引擎一行一行執(zhí)行js代碼之前,會(huì)先對(duì)js文件預(yù)處理,會(huì)把變量聲明和函數(shù)聲明提升到執(zhí)行環(huán)境的頂部,例如
console.log(a);<!--不會(huì)報(bào)錯(cuò),只會(huì)輸出undefined,因?yàn)樽兞柯暶魈嵘藇ar a;-->
console.log(a);<!--報(bào)錯(cuò),因?yàn)閍還沒(méi)有聲明-->
函數(shù)聲明前置也和變量聲明前置一樣會(huì)提升到執(zhí)行環(huán)境的頂部,但是如果發(fā)生命名沖突,函數(shù)聲明前置的優(yōu)先級(jí)會(huì)高于變量聲明前置,例如
fn();//輸出1,因?yàn)楹瘮?shù)聲明提高了
function fn() {
console.log (' 1 ');
}
function a() {
//body...
}
var a;
typeof a;//'function',因?yàn)楹瘮?shù)聲明前置的優(yōu)先級(jí)更高
3:求n!,用遞歸來(lái)實(shí)現(xiàn)
function fn(n) {
if (n ==1){
return 1;
}
return n * fn(n-1);
}
4:什么是立即執(zhí)行的函數(shù)表達(dá)式?有什么作用?
聲明一個(gè)匿名函數(shù)然后用一對(duì)括號(hào)講匿名函數(shù)包起來(lái),接著馬上調(diào)用這個(gè)匿名函數(shù)。不寫(xiě)的話報(bào)錯(cuò)Uncaught SyntaxError: Unexpected token
.
作用:一是用于避免變量的全局污染。二來(lái)函數(shù)內(nèi)部形成了一個(gè)單獨(dú)的作用域,可以封裝一些外部無(wú)法讀取的私有變量。
5如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo() // 10
}
1.globalContext = {
AO: {
x: 10
foo: function() {}
bar: function() {}
} ,
}
foo.[ [scope] ] = globalContext.AO
bar.[ [scope] ] = globalContext.AO
2. fooContext = {
AO: {}
Scope: foo.[ [scope] ] = globalContext.AO
}
3.barContext ={
AO: {
x=30
}
Scope:bar.[[ scope] ] = globalContext.AO
6以下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼?
var x = 10;
bar(); //結(jié)果是30
function bar(){
var x =30;
fuction foo(){
console.log(x);
}
foo();
}
1.globalContext = {
AO{
x:10;
foo:function;
bar:function;
}
scope:null;
}
foo.[ [ scope ] ] = globalContext.AO;
bar.[ [ scope ] ] = globalContext.AO;
2.barContext={
AO{
x=30;
foo:function;
}
scope:bar.[[scope]]
}
foo.[[scope]]=barContext.AO
3.fooContext={
AO {}
scope:foo.[ [ scope ] ]
}