函数声明和函数表达式有什么区别
函数声明
使用function关键字可以声明一个函数
//函数声明
function sayHello(){
console.log('hello')
}
//函数调用
sayHello()
函数表达式
var sayHello = function(){
console.log('hello');
}
sayHello()
区别
函数声明:声明不必放到调用的前面
函数表达式:声明必须放到调用的前面
什么是变量的声明前置?什么是函数的声明前置
- 变量提升:JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后在一步一步的运行,这就造成所有变量的声明都会被提到头部。
- JavaScript引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,被提升到相关作用域的前部。
- 变量声明前置:在全局作用域中造成的。
- 函数声明前置:在局部作用域中造成的。
arguments 是什么
arguments 是JavaScript里的一个内置对象,有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数。object对象。
function t(){
alert(arguments[0]);//显示t函数的输入参数,这里是2
}
t('2');//调用函数,传入参数2
在函数内部,你可以使用arguments对象获取到该函数的所有传入参数
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
}
函数的"重载"怎样实现
在一些其他语言中,重载函数常用来实现功能类似而所处理的数据类型不同的问题。
但是在Js中,是没有重载的,因为同名函数会覆盖。但可以在函数体针对不同的参数调用执行相应的逻辑
例如:
function printPeopleInfo(name, age, sex){
if(name){
console.log(name);
}
if(age){
console.log(age);
}
if(sex){
console.log(sex);
}
}
printPeopleInfo('Byron', 26);
printPeopleInfo('Byron', 26, 'male');
立即执行函数表达式是什么?有什么作用
先用一个圆括号把函数括起来, 再在后面加一对圆括号。
(function(){
var a = 1;
})()
console.log(a); //undefined
作用:立即执行被圆括号括起来的这个函数, 并能隔离作用域
求n!,用递归来实现
function factor(n){
if(n < 0) {
var point = console.log( "负数没有阶乘")
return point;
} else if ( n === 0 || n=== 1 ) {
return 1;
}
else{
return n * factor(n-1)
}
}
factor(5) //120
以下代码输出什么?
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, '男');
//name:饥人谷
//age:2
//sex:男
//arguments(3)
//name valley
getInfo('小谷', 3);
//name:小谷
//age:3
//sex:undefined
//arguments(2)
//name valley
getInfo('男');
//name:男
//age:undefined
//sex:undefined
//arguments(1)
//name valley
写一个函数,返回参数的平方和?
function sumOfSquares(){
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result2) //10
返回平方和
function sumOfSquares(){
var sum = 0;
var i = 1;
for( var i = 0 ; i < arguments.length; i++){
sum =sum+arguments[i]*arguments[i];
}
return sum;
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result2) //10
如下代码的输出?为什么
console.log(a);
var a = 1;
console.log(b);
输出步骤
var a //声明前置
console.log(a); //undefined,因为变量提升的原因,只是提升变量,未赋值
var a = 1;
console.log(b); // 报错,b is not defined。
// 代码中没有声明变量b也没有对其赋值
如下代码的输出?为什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
} //hello world
var sayAge = function(age){
console.log(age);
// 因为这是函数表达式,所以声明必须放到调用的前面
// 报错 输出 sayAge is not a function
};
如下代码输出什么? 写出作用域链查找过程伪代码
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
// 调用bar()
// 调用foo()
// 在foo里面查找x,未找到,往上一层查找
// x = 10
// 输出10
以下代码输出什么? 写出作用域链的查找过程伪代码
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
// var x = 10
// 调用 bar()
// var x = 30 ;
// (function ()){
// console.log(x)
// })() 查找x值
// 找到 x = 30
// console.log(30)
// 30
以下代码输出什么? 写出作用域链查找过程伪代码
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)
//1 倒数第二行 调用 fn()
//2 var a //声明前置
//3 console.log(a) //输出undefined
//4 var a = 5
//5 console.log(a) // 输出5
//6 a++
//7 var a // fn(){}内 a=6
//8 fn3() // 受全局变量影响
//9 调用 fn3() //fn3 不在fn函数 内,自己内部也没定义a
//10 所以往上查找,忽略 fn3() 内值,找到全局 var a = 1;
//11 console.log(a) // 输出 1
//12 a = 200 // 此时,fn3()内 a的值为200
//13 fn2() // 受fn(){}变量影响
//14 调用fn2(){} // 因为fn2(){} 在fn(){}内
//15 console.log(a) // 输出 6 (查看注释第7行)
//16 a = 20 // fn(){} a = 20(已被修改)
//17 console.log(a) // 受fn(){}变量影响
// 输出 20 (注释16行)
//18 console.log(a) // 受全局变量影响(注释12行)
//19 // 输出200