函數(shù)

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

聲明一個(gè)函數(shù)有三種方式
1.用function聲明一個(gè)函數(shù):


2.函數(shù)表達(dá)式方法:


3.function構(gòu)造函數(shù)的方法(一般不使用):


因?yàn)樽兞刻嵘脑?,函?shù)表達(dá)式的方法提升的是var print,所以用function聲明的函數(shù)在執(zhí)行時(shí),會(huì)把函數(shù)提升到j(luò)s語(yǔ)句的頂部,所以即使函數(shù)調(diào)用出現(xiàn)在函數(shù)聲明的前面,也不會(huì)出現(xiàn)報(bào)錯(cuò);而用函數(shù)表達(dá)式的方法聲明的函數(shù)提升的是var定義的變量,所以會(huì)報(bào)錯(cuò)。

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

JS語(yǔ)言的特性是JS引擎在解析JS代碼時(shí)會(huì)先獲取所有被聲明的變量然后再一行一行的運(yùn)行,所以所有var聲明的變量和function聲明的函數(shù)會(huì)前置到代碼頭部,所以使用或調(diào)用在其后的變量或函數(shù)也不會(huì)報(bào)錯(cuò)

arguments 是什么

arguments是一個(gè)類(lèi)數(shù)組對(duì)象,對(duì)應(yīng)于傳遞給函數(shù)的參數(shù),可以通過(guò)索引的方式訪問(wèn)函數(shù)傳入的參數(shù),arguments[i],i為數(shù)組中元素的索引

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

JS里因?yàn)橥瘮?shù)會(huì)被覆蓋所以沒(méi)有重載,但是可以在函數(shù)體針對(duì)不同的參數(shù)調(diào)用執(zhí)行相應(yīng)的邏輯(模擬重載)


注意:傳參時(shí)需注意傳入?yún)?shù)的順序

立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用
立即執(zhí)行函數(shù)的作用是隔離作用域,使被執(zhí)行的函數(shù)內(nèi)部的變量不會(huì)污染到外部,即外部不能訪問(wèn)函數(shù)內(nèi)部的變量。寫(xiě)法:

  1.       (function fn(){})()
    
  2.       [function fn(){}]()
    
  3.       !function fn(){}()
    
求n!,用遞歸來(lái)實(shí)現(xiàn)

打印結(jié)果:

寫(xiě)一個(gè)函數(shù),返回參數(shù)的平方和?
如下代碼的輸出?為什么
   console.log(a);
   var a = 1;
   console.log(b);

因?yàn)槁暶髑爸?,所以上面代碼等價(jià)于:

var a
console.log(a);
a = 1;
console.log(b);

所以console.log(a)輸出 undefined
console.log(b)輸出b is not defined

如下代碼的輸出?為什么
sayName('world');
sayAge(10);
function sayName(name){
    console.log('hello ', name);
}
var sayAge = function(age){
    console.log(age);
};

聲明前置所以代碼等價(jià)于:

   function sayName(name){
    console.log('hello ', name);
}
   var sayAge
   sayName('world');
   sayAge(10);
   sayAge = function(age){
    console.log(age);
};

所以sayName('world');輸出 hello world
sayAge(10);輸出 sayAge is not a function

如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var x = 10
bar() 
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo()
}

偽代碼:

 1.globalContext = {
      AO: {
        x: 10
        foo: function(){}
        bar: function(){}
      }
   Scope: null
   }
// 聲明 foo 時(shí) 得到下面
foo.[[scope]] = globalContext.AO
bar.[[scope]] = globalContext.AO
//調(diào)用bar()時(shí) 進(jìn)入bar()的執(zhí)行上下文
2. barContext={
    AO: {
        x:30
    }
    bar.[[scope]] = globalContext.AO
    }
//調(diào)用foo()時(shí) 進(jìn)入foo()的執(zhí)行上下文
3. fooContext={
    AO:{    }
    foo.[[scope]] = globalContext.AO
    }

foo( )的x是globalContext的x 所以輸出10

如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var x = 10;
   bar() 
function bar(){
   var x = 30;
   function foo(){
       console.log(x) 
   }
  foo();
 }  

偽代碼:

1.globalContext = {
      AO: {
        x: 10
        bar: function(){}
      }
   Scope: null
   }
// 聲明 bar 時(shí) 得到下面
bar.[[scope]] = globalContext.AO
2. barContext = {
     AO: {
     x: 30,
     foo: function
 },
    Scope: bar.[[scope]] //globalContext.AO
 }
    foo.[[scope]] = barContext.AO
3. fooContext = {
    AO: {},
    Scope: foo.[[scope]] // barContext.AO
 }

調(diào)用foo( )時(shí)先在foo的AO里找,找不到再去bar的AO里找 所以輸出30

如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var x = 10;
bar() 
function bar(){
   var x = 30;
   (function (){
      console.log(x)
   })()
}

執(zhí)行過(guò)程同上一題但是bar內(nèi)嵌套的是一個(gè)立即執(zhí)行函數(shù)聲明以后立即調(diào)用并執(zhí)行自身同時(shí)其內(nèi)部沒(méi)有x變量所以會(huì)去bar的AO里找所以輸出 30

如下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼
var a = 1;

function fn(){
  console.log(a)
  var a = 5
  console.log(a)
  a++
  var a
  fn3()
  fn2()
  console.log(a)

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

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

fn()
console.log(a)

聲明前置后:

var a = 1;

function fn(){
  var a
  console.log(a)
  a = 5
  console.log(a)
  a++
  fn3()
  fn2()
  console.log(a)

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

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

執(zhí)行過(guò)程如下:調(diào)用fn( )后進(jìn)入其執(zhí)行上下文,首先var a但未賦值所以打印undefined后 a=5所以打印5,a++此時(shí)fn內(nèi)部a為6,調(diào)用fn3時(shí)進(jìn)入fn3的執(zhí)行上下文首先打印1后a=200污染了全局變量a,執(zhí)行完退出調(diào)用fn2進(jìn)入fn2的執(zhí)行上下文打印6,執(zhí)行a=20污染了fn內(nèi)部的變量a所以打印出20最后在打印200

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)解析器會(huì)率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可以訪問(wèn);函數(shù)表達(dá)式則必須...
    coolheadedY閱讀 446評(píng)論 0 1
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 區(qū)別: 函數(shù)聲明后面的分號(hào)可加可不加,不加也不影響接下來(lái)語(yǔ)句的執(zhí)行,但...
    Sheldon_Yee閱讀 470評(píng)論 0 1
  • 問(wèn)答題 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)答://函數(shù)聲明function hello(){ conso...
    饑人谷_桶飯閱讀 293評(píng)論 0 0
  • 一、函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別?(*) ECMAScript里面規(guī)定了三種聲明函數(shù)的方式: 構(gòu)造函數(shù)函數(shù)也是對(duì)...
    婷樓沐熙閱讀 587評(píng)論 0 2
  • 我喜歡走在路上,那種前方有什么東西等著我的到來(lái)的感覺(jué)真好,我覺(jué)得旅行的形式有很多種,不只是走出自己的城市,...
    汪先生和陳太太閱讀 404評(píng)論 0 3

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