<ol>
<li><h5>函數聲明和函數表達式有什么區別</h5>
<ul><li>函數聲明:
function functionName(){
statement;
}</li>
<li>函數表達式:
var printName = function (){
console.log( 'Byron' );
};</li>
<li>函數聲明會被前置,確保在所有代碼執行之前聲明已經被解析,而函數表達式,只在執行到某一句時也會對其進行解析,所以在實際中,它們還是會有差異的,具體表現在,當使用函數聲明的形式來定義函數時,可將調用語句寫在函數聲明之前,而后者,這樣做的話會報錯。</li></ul>
</li>
<li><h5>什么是變量的聲明前置?什么是函數的聲明前置</h5>
<ul>
<li>變量的聲明被提前到作用域的開始處,而賦值操作被保留在原處</li>
<li>js解析器會優先解析函數聲明,確保所有代碼執行之前已經全部被解析,無論在哪里調用此函數都會執行</li>
</ul>
</li>
<li><h5>arguments是什么?</h5>
<ul>
<li>函數內使用arguments獲得傳入該函數的所有參數,如下圖:</li>
</ul>
</li>
<li><h5>函數的重載怎樣實現</h5>
<ul><li>不給函數寫形參,通過函數內部遍歷arguments實現,如圖:</li>
</li>
<li><h5>立即執行函數表達式是什么?有什么作用?</h5>
<ul><li>function加上括號,如下:</li>
(function(){...}()
(function(){...}())
作用:可以使用匿名函數將作用域隔開,不影響全局變量</ul>
</li>
<li><h5>什么是函數的作用域鏈?</h5>
<ul>
<li>JS中的作用域分為全局作用域和局部作用域,當代碼在一個環境中執行時,會創建變量對象的的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。作用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象。如果這個環境是一個函數,則將其活動對象作為變量對象。</li>
<li>每一個函數都有自己的執行環境,當執行流進一個函數時,函數環境就會被推入一個環境棧中,而在函數執行之后,棧將其環境彈出,把控制權返回給之前的執行環境,這個棧也就是作用域鏈。</li>
</li>
</ol>
代碼
<ol>
<li><h5>以下代碼輸出什么?</h5>
<ul>
</ul>
</li>
<li><h5>寫一個函數,返回參數的平方和?如:</h5>
</li>
<li><h5>如下代碼的輸出?為什么</h5>
console.log(a); //undefined
var a = 1;
console.log(b);//報錯
原因:由于變量聲明會提前,所以以上代碼相當于:
var a;
console.log(a);
a = 1;
console.log(b);
而b并沒有聲明,所以打印時會報錯
</li>
<li><h5>如下代碼的輸出?為什么</h5>
function sayname(){...}是函數聲明式,函數會整體提升
而var sayAge = function(){...}是函數表達式,函數聲明提升,但表達式并未提升,運行時會報錯,以上代碼相當于:
</li>
<li><h5>如下代碼的輸出?為什么</h5>
function fn(){}
var fn = 3;
console.log(fn);
// 3
</li>
<li><h5>如下代碼的輸出?為什么</h5>
由于函數和變量的提升,以上代碼相當于:
<ul>
<li>第一次打?。簜魅氲膮禐閒n2=10,但fn2被定義的函數所覆蓋了,所以打印結果為函數</li>
<li>第二次打?。航ofn2賦值為3,打印結果為3</li>
<li>第三次打印:所在作用域并未定義fn,向上級作用域找到了定義函數fn,所以打印結果為函數</li></ul>
</li>
<li><h5>如下代碼的輸出?為什么</h5>
var fn = 1;
function fn(fn){
console.log(fn);
}
console.log(fn(fn));
輸出結果:報錯"fn is not a function",以上代碼相當于:
var fn;
function fn(fn){
console.log(fn);
}
fn = 1;
console.log(fn(fn));
函數被變量所覆蓋了。
</li>
<li><h5>如下代碼的輸出?為什么</h5>
console.log(j);
console.log(i);
for(var i=0; i<10; i++){</br>
var j = 100;
}
console.log(i);
console.log(j);
輸出結果:
//undefined
//undefined
//10
//100
原因:變量聲明會提前
</li>
<li><h5>如下代碼的輸出?為什么</h5>
因為以上代碼相當于:
</li>
<li><h5>如下代碼的輸出?為什么</h5>
以上代碼相當于下圖(附輸出結果):
</li>
</ol>
本文版權歸本人(簾外修竹)所有,轉載須說明來源