vip10-170103

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


  1. 函數(shù)聲明必須有標(biāo)識(shí)符,也就是常說(shuō)的函數(shù)名;函數(shù)表達(dá)式可以省略函數(shù)名。
    函數(shù)聲明(要帶標(biāo)識(shí)符)
function fnName(arg1, arg2, ...)

函數(shù)表達(dá)式

  • 省略標(biāo)識(shí)符:
    var variable=function(arg1, arg2, ...)
  • 帶有標(biāo)識(shí)符:
    var variable=function functionName(arg1, arg2, ...)
  1. 函數(shù)聲明會(huì)提前
    sayHello();<!-- 函數(shù)聲明 -->
    function sayHello () {
        alert ('HELLOJIRENGU.');
}
sayHello();<!-- 函數(shù)表達(dá)式 -->
var sayHello = function () { 
alert ('myname is jrg');
}

即函數(shù)聲明的話sayTruth()可以提前調(diào)用,而函數(shù)表達(dá)式是什么時(shí)候遇到什么時(shí)候執(zhí)行

2:什么是聲明前置


變量聲明前置就是在js引擎一行一行執(zhí)行js代碼之前,會(huì)先對(duì)js文件預(yù)處理,會(huì)把變量聲明和函數(shù)聲明提升到執(zhí)行環(huán)境的頂部,例如

console.log(a);<!--不會(huì)報(bào)錯(cuò),只會(huì)輸出undefined,因?yàn)樽兞柯暶魈嵘藇ar a;-->

console.log(a);<!--報(bào)錯(cuò),因?yàn)閍還沒(méi)有聲明-->

函數(shù)聲明前置也和變量聲明前置一樣會(huì)提升到執(zhí)行環(huán)境的頂部,但是如果發(fā)生命名沖突,函數(shù)聲明前置的優(yōu)先級(jí)會(huì)高于變量聲明前置,例如

fn();//輸出1,因?yàn)楹瘮?shù)聲明提高了
function fn()  {
   console.log (' 1 ');
}

function a() { 
//body...
}
var a;
typeof a;//'function',因?yàn)楹瘮?shù)聲明前置的優(yōu)先級(jí)更高

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


function fn(n) {
  if (n ==1){
    return 1;
}
     return n * fn(n-1);
}

4:什么是立即執(zhí)行的函數(shù)表達(dá)式?有什么作用?


聲明一個(gè)匿名函數(shù)然后用一對(duì)括號(hào)講匿名函數(shù)包起來(lái),接著馬上調(diào)用這個(gè)匿名函數(shù)。不寫(xiě)的話報(bào)錯(cuò)Uncaught SyntaxError: Unexpected token.
作用:一是用于避免變量的全局污染。二來(lái)函數(shù)內(nèi)部形成了一個(gè)單獨(dú)的作用域,可以封裝一些外部無(wú)法讀取的私有變量。

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


var x = 10
bar()
function foo() {
   console.log(x)
}
function bar(){ 
var x = 30 
foo() // 10
}
1.globalContext = {
      AO: {
         x: 10
         foo: function() {}
         bar: function() {}
      }   ,
}
foo.[ [scope] ] = globalContext.AO
bar.[ [scope] ] = globalContext.AO

2. fooContext = {
       AO:  {}
       Scope: foo.[ [scope] ] = globalContext.AO
   }
3.barContext ={
   AO: {
           x=30
  }
Scope:bar.[[ scope] ] = globalContext.AO

6以下代碼輸出什么? 寫(xiě)出作用域鏈查找過(guò)程偽代碼?


var x = 10;
bar(); //結(jié)果是30
function bar(){
      var x =30;
      fuction foo(){
           console.log(x);
      }
      foo();
}
1.globalContext = {
       AO{
              x:10;
              foo:function;
              bar:function;
        }
     scope:null;
}
foo.[ [ scope ] ] = globalContext.AO;
bar.[ [ scope ] ] = globalContext.AO;

2.barContext={
       AO{
             x=30;
             foo:function;
            }
      scope:bar.[[scope]]
   }
      foo.[[scope]]=barContext.AO
3.fooContext={
     AO {}
     scope:foo.[ [ scope ] ]
    }
最后編輯于
?著作權(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)容