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