JavaScript 函数

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

  • 函数声明:使用function关键字声明一个函数
  • 函数表达式:声明一个变量然后赋值为函数
  • **
  • 修改补充:
  • 函数声明有声明前置的作用,而函数表达式的赋值不能前置

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

  • 变量的声明前置:JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升
  • 函数的声明前置:如果使用函数声明来定义一个函数,那么函数声明会被提升到代码最前面运行

arguments 是什么

  • 函数中传入参数的数组,默认就有
  • **
  • 修改补充:
  • arguments并不是数组,而是类数组对象
    JavaScript 函数_第1张图片

函数的重载怎样实现

  • JS中不支持定义参数不同的同名函数,但是JS中函数调用没必要把所有参数都传入,传的参数永远被当做前几个
  • **
  • 修改补充:
  • JS中同名函数会被覆盖,JS重载示例如下:


    JavaScript 函数_第2张图片

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

(function(){
})();

作用:先创建一个匿名函数,然后调用它,一般不定义函数名,除非需要递归调用

什么是函数的作用域链

在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

  • **
  • 示例:
  • a为全局变量,可以被fn1和fn2访问,b为fn1的局部变量,可以被fn1和内部的fn2访问,c为fn2的局部变量,只能被fn2访问


    JavaScript 函数_第3张图片

代码题

  1. 以下代码输出什么
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('hunger', 28, '男');
    getInfo('hunger', 28);
    getInfo('男');

输出

name: hunger
age: 28
sex: 男
["hunger", 28, "男"]
name valley
name: hunger
age: 28
sex: undefined
["hunger", 28]
name valley
name: 男
age: undefined
sex: undefined
["男"]
name valley
  1. 写一个函数,返回参数的平方和?如
function sumOfSquares(){
   }
   sumOfSquares(2,3,4);   // 29
   sumOfSquares(1,3);   // 10

函数:

function sumOfSquares(){
      var sum=0;
      for(var i=0;i
  1. 如下代码的输出?为什么
console.log(a);
var a = 1;
console.log(b);

输出:
undefined和报错:var a;被提升,但是赋值在console.log后,而 b 未定义。

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

输出:
hello world 和报错:使用函数声明定义的函数被提升,而使用函数表达式定义的函数只提升定义声明var = sayAge;

  1. 如下代码的输出?为什么
function fn(){} 
var fn = 3; 
console.log(fn);

输出:
3:var fn;在函数声明之前,但是fn = 3;在函数声明之后

  1. 如下代码的输出?为什么
function fn(fn2){ 
   console.log(fn2); 
  var fn2 = 3; 
  console.log(fn2); 
  console.log(fn);
  function fn2(){ 
    console.log('fnnn2'); 
  }
}
fn(10);

输出:

function fn2(){ 
    console.log('fnnn2'); 
  }
3
function fn(fn2){ 
  console.log(fn2); 
  var fn2 = 3; 
  console.log(fn2); 
  console.log(fn);
  function fn2(){ 
    console.log('fnnn2'); 
  }
}

原因:函数内部执行顺序是

var fn2;
console.log(fn2);
fn2 = 3;
console.log(fn2);
console.log(fn);
  1. 如下代码的输出?为什么
var fn = 1; 
  function fn(fn){ 
  console.log(fn); 
} 
console.log(fn(fn));

结果:
报错:fn = 1;覆盖函数声明

  1. 如下代码的输出?为什么
console.log(j); 
console.log(i); 
for(var i=0; i<10; i++){ 
  var j = 100; 
} 
console.log(i); 
console.log(j);

输出:

undefined
undefined
10
100

原因:for语句是流程控制语句,不是函数,不会产生新的作用域,其内定义的变量是会发生变量提升的

  1. 如下代码的输出?为什么
fn(); 
var i = 10; 
var fn = 20; 
console.log(i); 
function fn(){ 
  console.log(i); 
  var i = 99; 
  fn2(); 
  console.log(i); 
  function fn2(){ 
    i = 100; 
  } 
}

输出

undefined
100
10

原因:先执行函数 fn();其内第一次log时,i 未赋值,第二次log时之前执行了 fn2();i 被赋值为100;然后第三次log时,i 被赋值为10;

  1. 如下代码的输出?为什么
var say = 0; 
(function say(n){ 
  console.log(n); 
  if(n<3) 
    return; 
  say(n-1); 
}( 10 )); 
console.log(say);

输出

10
9
8
7
6
5
4
3
2
0

原因:立即执行函数内部发生递归,从10开始,直到n = 2时,return;n = 2是函数内最后一个打印的,然后跳出函数体,执行console.log(say); say = 0;

本教程版权归饥人谷和作者所有,转载须说明来源。

你可能感兴趣的:(JavaScript 函数)