进阶3

1.函数声明和函数表达式有什么区别

  • .以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的
  • 以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用.
  • 以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们不能出现在循环,条件或者try/catch/finally中,而 函数表达式可以在任何地方声明

2.什么是变量的声明前置?什么是函数的声明前置

  • 变量的声明前置:JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,然后给他初始值undefined,然后才逐句执行程序,这就叫做“变量提升”,也即“变量的声明前置”。
  • 函数的声明前置:函数声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面

3. arguments 是什么

arguments 是一个类似数组的对象, 对应于传递给函数的参数。
 arguments对象是函数内部的本地变量;arguments 已经不再是函数的属性了。可以在函数内部通过使用 arguments 对象来获取函数的所有参数。这个对象为传递给函数的每个参数建立一个条目,条目的索引号从0开始。它包括了函所要调用的参数。object对象。类数组。

4.函数的"重载"怎样实现

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

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

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

5.立即执行函数表达式是什么?有什么作用

立即执行函数表达式是一种声明和调用同时进行的函数表达式
作用:隔离作用域,避免声明污染

(function(){ var a = 1; })()
(function(){ var a = 1; }())
/*
当圆括号出现在匿名函数的末尾想要调用函数时,它会默认将函数当成是函数声明。当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明
*/

6.求n!,用递归来实现

function multiply(n){
    if(n===1 || n===0){
        return 1;
    }
    return n*multiply(n-1);
    if(n<0){
        return false;
    }
}

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. 写一个函数,返回参数的平方和?

 function sumOfSquares(){
      var sum=0;
        for(var 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

9. 如下代码的输出?为什么

    console.log(a);//undefined
    var a = 1;
    console.log(b);//b is not defined,没有b变量的声明

10. 如下代码的输出?为什么

sayName('world');//hello world
    sayAge(10);//sayAge(10) is not a function
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };
/*
由于对于function sayName(name)实用的是函数声明,对于var sayAge = function(age)使用的是函数表达式(函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用)
*/

11. 如下代码输出什么? 写出作用域链查找过程伪代码

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.[[scope]]=globalContext.AO
   bar.[[scope]]=globalContext.AO
2.调用bar()
   barContext = {
        AO:{
            x:30
        },
        Scope:bar.[[scope]] = globalContext.AO
    }
3.调用foo()
    fooContext = {
        AO:{},
        Scope:foo.[[scope]] = globalContext.AO
    }
    输出10
*/

12. 如下代码输出什么? 写出作用域链查找过程伪代码

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.[[scope]]=globalContext.AO
2.调用bar()
barContext = {
   AO:{
       x:30
      foo:function
   },
   scope:bar.[[scope]]=globalContext.AO
}
foo.[[scope]]=barContext.AO
3.调用foo()
fooContext = {
   AO:{},
   scope:foo.[[scope]]=barContext.AO
}
输出30
*/  

13. 以下代码输出什么? 写出作用域链的查找过程伪代码

var x = 10;
bar() 
function bar(){
  var x = 30;
  (function (){
    console.log(x)
  })()
  }
/*
1.
globalContext = {
   AO:{
      x:10
      bar:function
   },
   Scope:null
}
bar.[[scope]]=globalContext.AO
2.调用bar()
barContext = {
   AO:{
       x:30
       function
   },
   scope:bar.[[scope]]=globalContext.AO
}
function.[[scope]]=barContext.AO
3.调用foo()
functionContext = {
   AO:{},
   scope:function.[[scope]]=barContext.AO
}
输出30
*/

14. 以下代码输出什么? 写出作用域链查找过程伪代码

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)
/*
1.
    globalContext = {
        AO:{
            a:1
            fn:function
            fn3:function
        },
        Scope:null
    }
    fn.[[scope]] = globalContext.AO
    fn3.[[scope]] = globalContext.AO
    2.调用fn()
    fnContext = {
        AO:{
            a:undefined
            fn2:function
        },
        Scope:fn.[[scope]] // globalContext.AO
    }
    fn2.[[scope]] = fnContext.AO
    3.调用fn3()
    fn3Context = {
        AO:{
            a:200
        },
        Scope:fn3Context.[[scope]]//globalContext.AO
    }
    fn2ConText = {
        AO:{
            a:20
        },
        Scope:fn2ConText.[[scope]]//fnContext.AO
    }
首先运行fn(),由于fn()内定义了a所以console.log(a)为undefined,然后a=5,所以console.log(a)为5,a++使a为6,运行fn3(), fn3.[[scope]] = globalContext.AO,故console.log(a)为1然后a=200,使得globalContext.AO中a变成200,运行fn2()由于fn2.[[scope]] = fnContext.AO所以console.log(a)为6,由于a=20是全局定义,使得fnContext.AO中a变成20,console.log(a)变成20.最后运行全局的console.log(a)为200
所以输出为
undefined
5
1
6
20
200
*/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • 1.函数声明和函数表达式有什么区别 函数声明 代码执行时函数声明会被提升到最前执行,所以函数的调用与函数声明的顺序...
    Feiyu_有猫病阅读 371评论 0 0
  • 1.函数声明和函数表达式有什么区别 使用函数声明来声明的函数不需要放在调用的前面就可以被调用,使用函数表达式声明的...
    饥人谷_星璇阅读 216评论 0 0
  • 函数声明和函数表达式有什么区别 使用函数声明,如果函数被提前调用也是可以正常运行的;如果使用函数表达式,和变量提升...
    饥人谷_严琰阅读 229评论 0 0
  • 《没有比偶然的遇合更必然的东西》 若干年前我出过一次车祸,所幸人无伤亡。那天我在雨天的高速公路上行驶,因视线不好特...
    妙趣横生的时光阅读 679评论 0 50
  • 海洋奇缘说的是海洋,如果是天空奇缘就会说寻找自己的天空。天空和海洋只是一个比喻,是自己的使命之地,完成使命的地方和...
    芜庸阅读 500评论 0 0