js之函数

2016-10-31  本文已影响0人  车万里

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

函数声明:

function functionName(){
    statement;
}

使用function关键字声明一个函数
函数表达式:

var printName = function(){
    console.log('Byron');
};

声明一个变量赋值其为函数

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

变量的声明前置:先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部
函数的声明前置:和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样,如果我们使用函数声明的方式,那么即使函数写在最后也可以在前面语句调用。

3.arguments 是什么

arguments可以获取到该函数的所有传入参数

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

4.函数的重载怎样实现

在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面的

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

//方法1
( function() {
}() );
//方法2
( function() {
} )();

作用:创建一个独立的作用域,外面访问不到变量,避免污染

6、什么是函数的作用域链

任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
1.全局作用域
 在代码中任何地方都能访问到的对象拥有全局作用域
2.局部作用域
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域
作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain,不简称sc)来保证对执行环境有权访问的变量和函数的有序访问。作用域第一个对象始终是当前执行代码所在环境的变量对象,如果当前环境没有,就依次访问上一级变量。

代码

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;

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

function sumOfSquares(){
   var sum=0;
    for(var i=0;i<arguments.length;i++){
      sum +=arguments[i]*arguments[i];
    }
console.log(sum);
 } 

sumOfSquares(2,3,4); // 29 
sumOfSquares(1,3); // 10

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

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

声明(var)会被前置,所以a是undefined,而b未被声明,所以报错。

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

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

因为声明和定义函数会前置,可转换为

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

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

function fn(){
}
 var fn = 3;
 console.log(fn);//3

可转化为

 var fn
function fn(){}
 fn = 3;
 console.log(fn);/

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

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');
  }
 }

可转化为

function fn(fn2){ 
  var fn2//声明提前
  function fn2(){
     console.log('fnnn2');
  }//函数定义提前
  console.log(fn2); //打印fn2这一函数
   fn2 = 3;
  console.log(fn2); //3
  console.log(fn);//打印fn函数
 
 }
 fn(10);

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

var fn = 1; 
function fn(fn){ 
    console.log(fn);
 }
 console.log(fn(fn)); //报错

等同于

var fn; 
function fn(fn){ 
    console.log(fn);
 }
fn = 1//fn变成了1
 console.log(fn(fn));//fn 不是函数,报错

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

 //作用域 
console.log(j);
 console.log(i);
 for(var i=0; i<10; i++){ 
    var j = 100;
 }
 console.log(i);
 console.log(j);
undefined;
undefined;//i和j都未定义
10;//for循环的声明都是全局变量
100;

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

 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;

等同于

var i;
var fn;
function fn(){
    var i;//声明前置
     function fn2(){
       i = 100;
      }//函数定义前置
    console.log(i); //i未定义
     i = 99;
    fn2();//i变成100
    console.log(i);//100
   
    }
 fn(); //执行函数
 i = 10;//i变成10
 fn = 20;
console.log(i);10

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

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

代码等同于

var say;
(function say(n){
  console.log(n); 
  if(n<3) 
  return; 
  say(n-1); 
  }( 10 ));//函数立即执行,n初始值为10,循环直到n等于2停止
say = 0;
 console.log(say);//0
上一篇下一篇

猜你喜欢

热点阅读