函數(shù)與作用域3

1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別

函數(shù)聲明使用function關(guān)鍵字可以聲明一個(gè)函數(shù)
聲明不必放到調(diào)用的前面(函數(shù)聲明前置)
函數(shù)聲明必須有函數(shù)名

//函數(shù)聲明
  function sayHello(){
    console.log('hello')
  }
  //函數(shù)調(diào)用
  sayHello()

函數(shù)表達(dá)式聲明必須放到調(diào)用的前面
前后兩個(gè)函數(shù)的名字可以相同也可以不相同
function 后面的這個(gè)名字(sayHello)是可以省略的

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

第三種聲明函數(shù)方式,采用構(gòu)建函數(shù)
var sayHello=new Function("console.log('hello world');")

2.什么是變量的聲明前置?什么是函數(shù)的聲明前置

變量的聲明前置:在同一作用域下,先把所有的變量放在開(kāi)頭聲明
函數(shù)的聲明前置:與變量聲明前置同義,只不過(guò)是在函數(shù)作用域下,在開(kāi)頭先把變量聲明

3.arguments 是什么

在函數(shù)內(nèi)部,可使用arguments對(duì)象獲取到該函數(shù)的所有傳入?yún)?shù),需要注意定義了函數(shù)參數(shù),但沒(méi)有傳進(jìn)相應(yīng)的參數(shù)值,則沒(méi)有傳遞值的函數(shù)參數(shù)被自動(dòng)賦予undefined值,例如
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
}

4.函數(shù)的"重載"怎樣實(shí)現(xiàn)

JavaScript不能像強(qiáng)類型語(yǔ)言那樣實(shí)現(xiàn)函數(shù)重載,在定義兩個(gè)相同函數(shù)名的函數(shù),后一個(gè)函數(shù)會(huì)將前一個(gè)覆蓋,即 同名函數(shù)會(huì)覆蓋, 但可以在函數(shù)體針對(duì)不同的參數(shù)調(diào)用執(zhí)行相應(yīng)的邏輯
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.立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用

立即執(zhí)行函數(shù)就是聲明一個(gè)匿名函數(shù),定義函數(shù)后就立即執(zhí)行的函數(shù)。它的作用是隔離作用域,不會(huì)產(chǎn)生任何全局變量,寫(xiě)法:
(function fn1() {})();

6.求n!,用遞歸來(lái)實(shí)現(xiàn)

function f(n){
if(n>1){
return n*f(n-1);}
else if(n==1){
return 1;}
else{
return 0;}
}

7.以下代碼輸出什么?

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, '男');
getInfo('小谷', 3);
getInfo('男');
/*輸出結(jié)果
name:饑人谷
age:2
sex:男
["饑人谷", 2, "男"]
name valley */

/*name:小谷
age:3
sex:undefined
["小谷", 3 ]
name valley */

/*name:男
age:undefined
sex:undefined
["男"]
name valley */
  1. 寫(xiě)一個(gè)函數(shù),返回參數(shù)的平方和?
  function sumOfSquares(){
    var sum=0;
    for(i=0;i<arguments.length;i++){
    sum=sum+arguments[i]*arguments[i]
    }
 return sum;
  }
   var result = sumOfSquares(2,3,4)
   var result2 = sumOfSquares(1,3)
   console.log(result)  //29
   console.log(result2)  //10
  1. 如下代碼的輸出?為什么
console.log(a);
var a = 1;
console.log(b);

/*
輸出結(jié)果為:
undefined
Uncaught ReferenceError: b is not defined
將變量聲明前置并重寫(xiě)
var a;
console.log(a);
a = 1;
console.log(b);//b沒(méi)有聲明及賦值,故報(bào)錯(cuò)
 */
  1. 如下代碼的輸出?為什么
    sayName('world');
    sayAge(10);
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };
/*輸出結(jié)果
hello world
Uncaught TypeError: sayAge is not a function*/
function聲明的函數(shù),會(huì)前置,故該函數(shù)的調(diào)用可以放在函數(shù)聲明前面,
var sayAge = function(age)是一個(gè)函數(shù)表達(dá)式,調(diào)用必須放在后面,故報(bào)錯(cuò)*/
  1. 如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var x = 10
bar() 
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo()
}
/*globalContext = {
  AO: {
    x: 10
    foo: function
    bar: function
  },
  Scope: null
}
聲明 foo 時(shí) 得到下面
foo.[[scope]] = globalContext.AO
聲明 bar 時(shí) 得到下面
bar.[[scope]] = globalContext.AO
輸出結(jié)果是:10 */
  1. 如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var x = 10;
bar() 
function bar(){
  var x = 30;
  function foo(){
    console.log(x) 
  }
  foo();
}
/*globalContext = {
  AO: {
    x: 10
    bar: function
  },
  Scope: null
}
聲明 bar 時(shí) 得到下面
bar.[[scope]] = globalContext.AO

barContext = {
  AO: {
    x: 30,
    foo: function
  },
  Scope: bar.[[scope]] //globalContext.AO
}
在 bar 的執(zhí)行上下文里聲明 foo 時(shí) 得到下面
foo.[[scope]] = barContext.AO
最后輸出結(jié)果是:30*/    
  1. 以下代碼輸出什么? 寫(xiě)出作用域鏈的查找過(guò)程偽代碼
var x = 10;
bar() 
function bar(){
  var x = 30;
  (function (){
    console.log(x)
  })()
}
/*globalContext = {
  AO: {
    x: 10
    bar: function
  },
  Scope: null
}
聲明 bar 時(shí) 得到下面
bar.[[scope]] = globalContext.AO

barContext = {
  AO: {
    x: 30,
    (function (){console.log(x)}): function
  },
  Scope: bar.[[scope]] //globalContext.AO
}
在 bar 的執(zhí)行上下文里聲明 foo 時(shí) 得到下面
(function (){console.log(x)}).[[scope]] = barContext.AO
最后輸出結(jié)果是:30*/    
  1. 以下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var a = 1;
function fn(){
  console.log(a)   //undefiend
  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 
/*globalContext = {
  AO: {
    a: 1
    fn: function
    fn3: function
  },
  Scope: null
}
聲明 fn 時(shí) 得到下面
fn.[[scope]] = globalContext.AO
聲明 fn3 時(shí) 得到下面
fn3.[[scope]] = globalContext.AO


fn.Context = {
  AO: {
    a: undefiend
    fn2: function
  },
  Scope: fn.[[scope]] //globalContext.AO
}
在fn 的執(zhí)行上下文里聲明 fn2時(shí) 得到下面
fn2.[[scope]] = fnContext.AO*/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 使用function關(guān)鍵字聲明一個(gè)函數(shù)時(shí),聲明不必放到調(diào)用的前面。//函數(shù)聲...
    _李祺閱讀 281評(píng)論 0 0
  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別? 函數(shù)聲明和函數(shù)表達(dá)式是EMACScript規(guī)定的兩種不同的聲明函數(shù)的方法。1.函...
    LeeoZz閱讀 354評(píng)論 0 1
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 區(qū)別: 函數(shù)聲明后面的分號(hào)可加可不加,不加也不影響接下來(lái)語(yǔ)句的執(zhí)行,但...
    Sheldon_Yee閱讀 410評(píng)論 0 1
  • 任務(wù) 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別答:函數(shù)聲明:function functionName(){}??函數(shù)表達(dá)式...
    mhy_web閱讀 422評(píng)論 0 0
  • 聲明前置和作用域也是JS 部分面試常考點(diǎn) 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 函數(shù)聲明:使用function關(guān)鍵字...
    湖衣閱讀 210評(píng)論 0 0