函数声明和函数表达式有什么区别
- 函数声明:使用function关键字声明一个函数
- 函数表达式:声明一个变量然后赋值为函数
- **
- 修改补充:
- 函数声明有声明前置的作用,而函数表达式的赋值不能前置
什么是变量的声明前置?什么是函数的声明前置
- 变量的声明前置:JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升
- 函数的声明前置:如果使用函数声明来定义一个函数,那么函数声明会被提升到代码最前面运行
arguments 是什么
- 函数中传入参数的数组,默认就有
- **
- 修改补充:
-
arguments并不是数组,而是类数组对象
函数的重载怎样实现
- JS中不支持定义参数不同的同名函数,但是JS中函数调用没必要把所有参数都传入,传的参数永远被当做前几个
- **
- 修改补充:
-
JS中同名函数会被覆盖,JS重载示例如下:
立即执行函数表达式是什么?有什么作用
(function(){
})();
作用:先创建一个匿名函数,然后调用它,一般不定义函数名,除非需要递归调用
什么是函数的作用域链
在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
- **
- 示例:
-
a为全局变量,可以被fn1和fn2访问,b为fn1的局部变量,可以被fn1和内部的fn2访问,c为fn2的局部变量,只能被fn2访问
代码题
- 以下代码输出什么
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
- 写一个函数,返回参数的平方和?如
function sumOfSquares(){
}
sumOfSquares(2,3,4); // 29
sumOfSquares(1,3); // 10
函数:
function sumOfSquares(){
var sum=0;
for(var i=0;i<arguments.length;i++){
sum+=arguments[i]*arguments[i];
}
console.log(sum);
}
- 如下代码的输出?为什么
console.log(a);
var a = 1;
console.log(b);
输出:
undefined和报错:var a;被提升,但是赋值在console.log后,而 b 未定义。
- 如下代码的输出?为什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
输出:
hello world 和报错:使用函数声明定义的函数被提升,而使用函数表达式定义的函数只提升定义声明var = sayAge;
- 如下代码的输出?为什么
function fn(){}
var fn = 3;
console.log(fn);
输出:
3:var fn;在函数声明之前,但是fn = 3;在函数声明之后
- 如下代码的输出?为什么
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);
- 如下代码的输出?为什么
var fn = 1;
function fn(fn){
console.log(fn);
}
console.log(fn(fn));
结果:
报错:fn = 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语句是流程控制语句,不是函数,不会产生新的作用域,其内定义的变量是会发生变量提升的
- 如下代码的输出?为什么
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;
- 如下代码的输出?为什么
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;
本教程版权归饥人谷和作者所有,转载须说明来源。