函數(shù)與作用域

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

  • 函數(shù)聲明: 聲明不必放到調(diào)用的前面
var a= test(6);
function test(x){
    return x*x;
}
  • 函數(shù)表達式: 聲明必需放到調(diào)用的前面
var test = function(x){
   return x*x
}
var a = test(6);

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

在同一作用域下,var 聲明的變量和function 聲明的函數(shù)會前置

console(a);
var a = 1;
//變量聲明前置的結(jié)果
var a;
console(a);  
a=1;

var a= test(6);
function test(x){
    return x*x;
}
//函數(shù)聲明前置的結(jié)果
function test(x){
    return x*x;
}
var a= test(6);

3. arguments 是什么

http://www.w3school.com.cn/js/pro_js_functions_arguments_object.asp
在函數(shù)代碼中,使用特殊對象 arguments,開發(fā)者無需明確指出參數(shù)名,就能訪問它們。還可以用 arguments 對象檢測函數(shù)的參數(shù)個數(shù),引用屬性 arguments.length 即可。

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

在JavaScript中,由于同名函數(shù)會被覆蓋,因此JavaScript中沒有真正的重載,但是可以在函數(shù)內(nèi)部通過針對不同的參數(shù)執(zhí)行相應的邏輯來模擬“重載”

  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ù)表達式是什么?有什么作用

(Immediately-Invoked Function Expression,簡稱IIFE)

  • 立即執(zhí)行函數(shù)模式是一種語法,可以讓你的函數(shù)在定義后立即被執(zhí)行。
  • js中沒有塊級作用域,可以用立即執(zhí)行函數(shù)來隔離作用域。
  1. 一個立即執(zhí)行函數(shù)能返回值并且可以賦值給其它變量:
var result = (function () {  
    return 2 + 2;  
}()); 
  1. 另外一種實現(xiàn)相同的功能的方法是省略包裹函數(shù)的括號,因為當你將立即執(zhí)行函數(shù)的返回值賦值給一個變量時它們不是必需的;
    var result = function () {  
        return 2 + 2;  
    }();  
  1. 還有另一種語法可以實現(xiàn)相同的功能:
    var result = (function () {  
        return 2 + 2;  
    })();  

http://blog.csdn.net/qq838419230/article/details/8030078

6. 求n!,用遞歸來實現(xiàn)

function factorial(x){
  if(x===1) { return x;}
  else if(x>1) { return x*factorial(x-1);}
  else (return "正整數(shù)才有階乘" )
}

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, '男');
/* 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
*/

8. 寫一個函數(shù),返回參數(shù)的平方和?

   function sumOfSquares(){
         var sum=0; // 記得賦值= =
         for(i=0;i< arguments.length;i++){
                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

9. 如下代碼的輸出?為什么

    console.log(a);  //undefined   變量a聲明前置,但未被賦值
    var a = 1;  
    console.log(b);  //b is not defined    b沒聲明

10. 如下代碼的輸出?為什么

    sayName('world');  // hello world  函數(shù)聲明
    sayAge(10);  // sayAge is not a function  這個函數(shù)是函數(shù)表達式定義的 必須前置才能用
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);  //10
    };

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

var x = 10
bar();   
function foo() {
  console.log(x)  // 輸出10 (global)
}
function bar(){
  var x = 30
  foo();
}

/*
globalContext = {
     AO: {
        x: 10
        foo: function
        bar: function
   },
     Scope: null
}
foo.[[scope]]==globalContext.AO;
bar.[[scope]]==globalContext.AO;
*/

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

var x = 10;
bar(); 
function bar(){
  var x = 30;
  function foo(){
    console.log(x)  
  }
  foo();  // 輸出30(bar)
}   
/*
globalContext = {
       AO: {
           x: 10
           bar: function
      },
       Scope: null
barContext = {
  AO: {
    x: 30,
    foo: function
  },
  Scope: bar.[[scope]] //globalContext.AO
}
foo.[[scope]] = barContext.AO
*/

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

var x = 10;
bar();
function bar(){
  var x = 30;
  (function (){
    console.log(x)// 立即執(zhí)行函數(shù),輸出30
  })()
}
/*
globalContext = {
    AO: {
        x: 10
       bar: function
    },
    Scope: null
}
barContext = {
    AO: {
      x: 30
   },
   Scope: globalContext.AO
}
*/

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

var a = 1;

function fn(){
  console.log(a)  // (1)輸出undefined
  var a = 5
  console.log(a)  // (2)輸出5
  a++  ;  // (3)a=6
  var a;  // (4)a=6
  fn3(); //(5)
  fn2() // (8)
  console.log(a)  // (11)輸出20

  function fn2(){
    console.log(a) // (9)輸出6 
    a = 20 // (10)fn中a=20
  }
}

function fn3(){
  console.log(a) // (6)輸出1
  a = 200 // (7)global中a=200
}

fn()  // 輸出undefined 5 1 6 20 
console.log(a)  // 輸出200
/*
 globalContext = {
       AO: {
         a: 1
         fn: function
         fn3: function
     },
    Scope: null
}
fnContext = {
      AO: {
          a: 5
          fn2: function
      },
     Scope: globalContext.AO
}
fn2Context={
        AO:{
            a: 20
       },
      Scope: fnContext.AO
}
fn3Context = {
      AO: {
          a: 20
      },
     Scope: globalContext.AO
}
*/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 函數(shù)聲明和函數(shù)表達式有什么區(qū)別 函數(shù)聲明語法:function functionName(arg0,arg1,ar...
    _Dot912閱讀 659評論 0 3
  • 1.函數(shù)聲明和函數(shù)表達式有什么區(qū)別 函數(shù)就是一段可以反復調(diào)用的代碼塊。函數(shù)還能接受輸入的參數(shù),不同的參數(shù)會返回不同...
    徐國軍_plus閱讀 527評論 0 0
  • 1.函數(shù)聲明和函數(shù)表達式有什么區(qū)別 函數(shù)聲明 代碼執(zhí)行時函數(shù)聲明會被提升到最前執(zhí)行,所以函數(shù)的調(diào)用與函數(shù)聲明的順序...
    Feiyu_有貓病閱讀 466評論 0 0
  • 1.函數(shù)聲明和函數(shù)表達式有什么區(qū)別 function命令聲明的代碼區(qū)塊,就是一個函數(shù)。function命令后面是函...
    饑人谷_Leon閱讀 336評論 0 0
  • 早安。小雨,微風,很冷。 11點50分。已經(jīng)是響午了,午飯前的一篇心情。 冬天比往年來得更晚一些,室外溫度也在持續(xù)...
    ze喬閱讀 166評論 0 0

友情鏈接更多精彩內(nèi)容