进阶3-函数与作用域

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

函数声明:
function sayHello(){ console.log('hello') }
调用:sayName()
声明不用放到调用前面,声明时候不执行调用时候才执行
函数表达式:
var sayName = fimction() { console.log('hello') }
调用:sayName()
声明必须放到调用的前面

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

JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting),也称变量的声明前置。
函数的声明前置指的是声明的函数会提升到当前作用域的顶部。

3.arguments 是什么

类数组对象,在函数内部,可以使用arguments对象获取该函数的所有传入参数

function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
}

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

在JS中,没有重载。同名函数会覆盖。但可以在函数体针对不同的参数调用执行相应的逻辑。重载是成立不同的参数做不同的事情。
例:

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

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

 if(sex){
   console.log(sex);
 }
}
printPeopleInfo('Byron', 26);//Byron 26
printPeopleInfo('Byron', 26, 'male');//Byron 26 male

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

起到隔离作用,不会产生全局变量污染的问题,形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。
例:
(function(){ var a=1; var b=2; }) ()

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

function factor(n){
if(n===1){
return 1
}
else if(n=== -1){
return -1
}
else if(n=== 0){
return 0
}
return n * factor(n-1)
}
调用: factor(5)

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('男');
name: 饥人谷
 age: 2
 sex: 男
(3) ["饥人谷", 2, "男", callee: function, Symbol(Symbol.iterator): function]
 name valley
 name: 小谷
age: 3
sex: undefined
(2) ["小谷", 3, callee: function, Symbol(Symbol.iterator): function]
 name valley
 name: 男
 age: undefined
 sex: undefined
 ["男", callee: function, Symbol(Symbol.iterator): function]
name valley

8. 写一个函数,返回参数的平方和?

function sumOfSquares(){
    var result = 0;
    for(var i = 0;i < arguments.length;i++){
        result += Math.pow(arguments[i],2)
    }
    return result;
   }
   var result = sumOfSquares(2,3,4)
   var result2 = sumOfSquares(1,3)
   console.log(result)  //29
   console.log(result2)  //10

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

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

输出console.log(a)为undefined,var不是函数前置后,console.log(b)为声明输出为undefined,结果就是undefined

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

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

function sayName(name)是函数声明可以先写调用再写声明,var sayAge = function(age)是函数表达式,声明必须写在调用前面,而且sayAge(10)前置了输出结果是undefined

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

var x = 10
bar() 
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo() // 10
}
1.
globalContent ={
AO:{
x: 10
foo: function
bar: function
},
Scope: null
}
//声明foo时 得到下面
foo.[[scope]] = golbalContenxt.AO
//声明bar时 得到下面
bar.[[scope]] = golbalContenxt.AO
2.
barContext ={
AO:{
x: 30
},
Scope: bar.[[scope]] //globalConyext.AO
}
3.
调用foo()时,先从bar执行上下文中的AO里找,找不到再从bar的[[scope]]里找,找到后即调用
fooContext={
AO:{}
Scope: foo.[[scope]] //globalContext.AO
}
foo里没有var、function。AO活动对象就是空的
foo.[[scope]] = golbalContenxt.AO
在自己里面没有找到,就从globalContext里面找,找到x=10, 所以console.log(x)=10

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.
barContext={
AO{
x: 30
foo: function(){}
},
Scope: bar.[[scope]]= barContext.AO
}
3.
fooContext={
AO{}
Scope: foo.[[Scope]]= barContext.AO
}
AO里没有值,foo在bar里,就回到barContext里面找到x: 30,则console.log(x)=30.

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.
barContext={
AO:{
x: 30
匿名: function(){}
},
Scope: bar.[[Scope]]= globalContext.AO
Scope: 匿名.[[scope]]= barlContext.AO
}
3.
匿名Context={
AO:{}
Scope: 匿名.[[scope]]= barlContext.AO
}

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)

输出:

undefined
5
1
6
20
200

分析:

1. globalContext={
AO:{
a: 1
fn: function
fn3: function
}
}

fn[[scope]]=globalContext.AO
fn3[[scope]]=globalContext.AO

2.fnContext={
AO:{
a: 6
fn2: function(){}
},
Scope: globalContext.AO
}
fn2[[scope]]=fnContext.AO

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

推荐阅读更多精彩内容