task3

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

函数声明

function functionName(){
    statement;
}

函数声明不必放到调用之前

函数表达式

var printName = function(){
    statement;
};

声明必须放到调用之前

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

变量的声明前置
在解析代码时,变量会被提到当前作用域开头来声明,然后运行到原来的位置时再赋值。在赋值之前的调用会返回undefined而不是出错。
函数的声明前置
函数声明也会被提到当前作用域开头来声明,这样可以在把声明放到调用之后。

3.arguments 是什么

在JavaScript中,arguments是对象的一个特殊属性。arguments对象就像数组,但是它却不是数组,而是一个Arguments对象。arguments有length属性。

function printPersonInfo(name, age, sex){
    console.log(name);
    console.log(age);
    console.log(sex);
    console.log(arguments[0]);
}
printPersonInfo("a","b","c");
a
b
c
a

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

根据传入参数的不同执行不同的逻辑

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

部分转自
立即执行函数能够立即执行,这样可以做到隔离作用域,避免变量污染全局。

var liList = ul.getElementsByTagName('li')
for(var i=0; i<6; i++){
  liList[i].onclick = function(){
    alert(i)      // 6
  }
}

为什么 alert 出来的总是 6,而不是 0、1、2、3、4、5因为 i 是贯穿整个作用域的,而不是给每个 li 分配了一个 i

image

那么怎么解决这个问题呢?用立即执行函数给每个 li 创造一个独立作用域即可(当然还有其他办法):

var liList = ul.getElementsByTagName('li')
for(var i=0; i<6; i++){
  !function(ii){
    liList[ii].onclick = function(){
     alert(ii) // 0、1、2、3、4、5
      }
  }(i)
} 

在立即执行函数执行的时候,i 的值被赋值给 ii,此后 ii 的值一直不变。
i 的值从 0 变化到 5,对应 6 个立即执行函数,这 6 个立即执行函数里面的 ii 「分别」是 0、1、2、3、4、5。

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

function fac(n){
    if(n===1||n===0){
      return 1;
    }
    return n*fac(n-1);
}
console.log(fac(10));

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('男');

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 += arguments[i]* arguments[i];
    }
    return sum;
}
console.log(sumOfSquares(2,5));   //29

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

    console.log(a);    //undefined    已经声明但是没有赋值
    var a = 1;
    console.log(b);    // 报错 未声明b

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

    sayName('world');    // hello world
    sayAge(10);    //报错 函数表达式必须在调用前声明
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };

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

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.调用bar()  barContext = {
    AO:{
        x:30;
    }
    scope:bar.[[scope]] = globalContext.AO
}
3.调用foo() fooContext = {
    AO:{}
    scope:foo.[[]scope] =globalContext.AO
}

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

var x = 10;
bar() 
function bar(){
  var x = 30;
  function foo(){
    console.log(x) 
  }
  foo();
}   
// 30
调用过程:
1. globalContext = {
    AO: {
        x: 10;
        bar:function
    }
    bar.[[scope]] = globalContext.AO
}
2.调用bar()  barContext = {
    AO:{
        x:30;
        foo:function
    }
    scope:bar.[[scope]] = globalContext.AO
    scope:foo.[[scope]] = barContext.AO
}
3.调用foo() fooContext = {
    AO:{}
    scope:foo.[[]scope] =barContext.AO
}

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

var x = 10;
bar() 
function bar(){
  var x = 30;
  (function (){
    console.log(x)
  })()
}
// 30
调用过程:
1. globalContext = {
    AO: {
        x: 10;
        bar:function
    }
    bar.[[scope]] = globalContext.AO
}
2.调用bar()  barContext = {
    AO:{
        x:30;
        匿名:function
    }
    scope:bar.[[scope]] = globalContext.AO
    scope:匿名.[[scope]] = barContext.AO
}
3.调用匿名函数()   匿名Context = {
    AO:{}
    scope:匿名函数.[[scope]] =barContext.AO
}

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

var a = 1;

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

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

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

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

推荐阅读更多精彩内容

  • 函数声明和函数表达式有什么区别 (*)解析器会率先读取函数声明,并使其在执行任何代码之前可以访问;函数表达式则必须...
    coolheadedY阅读 382评论 0 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,191评论 0 4
  • 问答部分 一、函数声明和函数表达式有什么区别? 二者表示函数的方式不一样,如下 函数声明(函数名称不可少) 函数表...
    dengpan阅读 411评论 0 0
  • 目录 1.静态作用域与动态作用域 2.变量的作用域 3.JavaScript 中变量的作用域 4.JavaScri...
    一缕殇流化隐半边冰霜阅读 7,067评论 37 113
  • 今日大盘低开高走,尾盘收出一根小阳线,成交量放大。盘面上看,石墨烯、宽带提速、保障房、OLED概念、量子通信等概念...
    赢家说_4d25阅读 174评论 0 0