函數與作用域

1.函數聲明和函數表達式有什么區別?Javascript 中函數聲明和函數表達式是存在區別的,函數聲明在JS解析時進行函數提升,因此在同一個作用域內,不管函數聲明在哪里定義,該函數都可以進行調用。而函數表達式的值是在JS運行時確定,并且在表達式賦值完成后,該函數才能調用。這個微小的區別,可能會導致JS代碼出現意想不到的bug,讓你陷入莫名的陷阱中。

2.什么是變量的聲明前置?什么是函數的聲明前置?

在一個作用域下,var 聲明的變量和function 聲明的函數會前置;函數和 var 一個變量聲明前置的大概意思是先有,再用;

var a = 3;console.log(a); //3

sayHello();

function sayHello(){
console.log('hello');
}

3.arguments 是什么?
在函數內部,你可以使用arguments對象獲取到該函數的所有傳入參數,通過arguments[1、2、3]等...可以獲取到相應的傳入參數.

4.函數的"重載"怎樣實現?
js沒有重載! 重載是函數具有相同的名字,但是由于傳入的參數不同,執行不同操作。在js中沒有類似其他語言的重載,因為同名函數會被覆蓋。但是js可以通過在函數內部對傳入參數進行判斷來達到重載的目的;

function printPeopleInfo(name, age, sex){
if(name){
console.log(name);
}

if(age){
console.log(age);}

if(sex){
console.log(sex);
}
}

printPeopleInfo('Byron', 26); printPeopleInfo('Byron', 26, 'male');

5.立即執行函數表達式是什么?有什么作用?
聲明一個匿名函數,馬上調用這個匿名函數;作用:創建一個獨立的作用域。

求n!,用遞歸來實現

function sum(n){
if(n === 1) {
return 1
}
return n + sum(n-1)
}
sum(n)

以下代碼輸出什么?

function getInfo(name, age, sex){
console.log('name:',name);
console.log('age:', age);
console.log('sex:', sex);
console.log(arguments);
arguments[0] = 'valley';
console.log('name', name);
}

getInfo('饑人谷', 2, '男');
//輸出:name:饑人谷;age:2;sex:男;['饑人谷',2,男];name valley;
getInfo('小谷', 3);
//輸出:name:小姑;age:3;sex:undefined;['小谷',3];name valley;
getInfo('男');
//輸出:name:男;age:undefined;sex:undefined;['男'];name valley;

寫一個函數,返回參數的平方和?

var result=0;
for (var i=0;i<arguments.length;i++) {
result = result + arguments[i]*arguments[i];
}
return result;
}
var demo = sumOfSquares(1,3);
console.log(demo);

如下代碼的輸出?為什么

console.log(a);//undefined;因為此函數作用于里面有一個聲明a,但是在此沒有賦值,所以是undefined;
var a = 1;
console.log(b)//報錯;因為b沒有聲明;

如下代碼的輸出?為什么

sayName('world');
sayAge(10);
function sayName(name){
    console.log('hello ', name);//hello world;調用函數的聲明sayname('world')=name,所以是hello world;
}
var sayAge = function(age){
    console.log(age);//報錯,因為沒有聲明;
};```
如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼

bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
//輸出為10;var聲明-->執行bar--->調用foo函數-->執行-->foo函數-->在foo函數里面尋找變量a.沒有找到在上下文里面尋找-->a=10;

如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼

var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
//輸出30;var聲明-->執行bar--->調用foo函數-->執行foo函數-->在foo函數里面尋找變量a.沒有找到在上下文里面尋找-->a=30;```

以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼

function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
//輸出30;var聲明-->執行bar--->立即執行函數function-->函數里面尋找變量a.沒有找到在上下文里面尋找-->a=30;

以下代碼輸出什么? 寫出作用域鏈查找過程偽代碼

function fn(){
console.log(a)//undefined
var a = 5
console.log(a)//5
a++
var a
fn3()//1
fn2()//6
console.log(a)//20

function fn2(){
console.log(a)//
a = 20
}
}

function fn3(){
console.log(a)//
a = 200
}

fn()
console.log(a)//200
//輸出:5,1,6,20,200;聲明a-->執行函數fn()-->輸出a為undefined(未定義)-->聲明a=5所以輸出5-->a自增1-->聲明a=6-->調用函數ffn3-->執行fn3()-->輸出結果為1-->聲明全局變量a=200-->fn3=1-->執行fn2()-->未在fn2()里面找到a變量,在fn()中尋找a=6,聲明fn()中的a=20-->執行輸出a=20-->執行全局變量a=200,輸出200
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 函數聲明和函數表達式有什么區別 函數聲明語法:function functionName(arg0,arg1,ar...
    _Dot912閱讀 580評論 0 3
  • 1.函數聲明和函數表達式有什么區別 函數就是一段可以反復調用的代碼塊。函數還能接受輸入的參數,不同的參數會返回不同...
    徐國軍_plus閱讀 484評論 0 0
  • 函數聲明和函數表達式有什么區別? 函數聲明和函數表達式是EMACScript規定的兩種不同的聲明函數的方法。1.函...
    LeeoZz閱讀 353評論 0 1
  • 1.函數聲明和函數表達式有什么區別 函數聲明:使用function關鍵字聲明函數,聲明不必放到調用的前面函數聲明在...
    BAWScipes閱讀 262評論 0 0
  • 1.函數聲明和函數表達式有什么區別 函數聲明使用function關鍵字進行聲明,聲明不必放到調用的前面。因為函數可...
    山門龍龍閱讀 326評論 0 0