函数与作用域
2017-04-25 本文已影响0人
冰滩波纹
1. 函数声明和函数表达式有什么区别
- 函数声明:
function functionName(){}
- 函数表达式:
var fn = function(){}
函数声明
会将函数提升,函数声明
不必放到调用的前面;
函数表达式
会将变量提升,函数表达式
必须放到调用的前面。
2. 什么是变量的声明前置?什么是函数的声明前置
- 变量的声明前置:变量的声明会被提升到作用域的顶部,而赋值则在原地,例如:
console.log(a);
var a = 1;
实际上是:
var a;
console.log(a);
a = 1;
所以上面的console.log(a);
结果为undefined
。
- 函数的声明前置:整个函数体会被提升到作用域的顶部,例如:
test(1)
function test(x){console.log(x);}
实际上是:
function test(x){console.log(x);}
test(1)
所以函数可以正常执行。
3. arguments 是什么
在函数体内,标识符arguments是指向实参对象的引用,实参对象是一个类数组。
arguments是收到的实参副本,在词法分析中, 首先按形参形成AO的属性,值为undefined,当实参传来时, 再修改AO的相应属性,并把所有收到实参收集起来,放到一个arguments对象里。例如:
t(a,b,c){},
调用时: t(1,2,3,4,5)
5个参数,此时 , AO属性只有a,bc,3个属性, arguments里有1,2,3,4,5, 所有的值。对于超出形参个数之外的实参, 可以通过arguments来获得,arguments.length 属性代表实参的个数。arguments一定不是数组, 是长的比较像数组的一个对象,虽然也有length属性。
4. 函数的"重载"怎样实现
首先,在JS中没有重载!同名的函数会覆盖。但可以在函数体针对不同的参数调用执行相应的逻辑
JS重载5. 立即执行函数表达式是什么?有什么作用
(function(){
var a = 1;
})()
作用: 隔离作用域。
6. 求n!,用递归来实现
function factor(n){
if(n === 1) {
return 1
}
return n * factor(n-1)
}
7. 以下代码输出什么?
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, '男');
getInfo('小谷', 3);
getInfo('男');
getInfo('饥人谷', 2, '男')
name:饥人谷
age: 2
sex: 男
['饥人谷', 2, '男']
name valley
2.getInfo('小谷', 3)
name:小谷
age: 3
sex: undefined
['小谷', 3]
name valley
3.getInfo('男')
name:男
age: undefined
sex: undefined
['男',]
name valley
8. 写一个函数,返回参数的平方和?
function sumOfSquares(){
var sum = 0;
var argLen = arguments.length;
for(var i = 0; i < argLen; i++ ){
sum = arguments[i] * arguments[i] + sum;
}
return sum;
}
var result = sumOfSquares(2,3,4);
var result2 = sumOfSquares(1,3);
console.log(result); //29
console.log(result2); //10
9. 如下代码的输出?为什么
console.log(a);
var a = 1;
console.log(b);
结果:
undefined
Uncaught ReferenceError: b is not defined
- a 的声明前置,但打印时未赋值,所以是 undefined;
- b没有被声明,所以是上述报错。
10. 如下代码的输出?为什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
结果:
hello world
Uncaught TypeError: sayAge is not a function
-
sayName
函数声明前置; -
sayAge
函数表达式只会将变量提升,必须放到调用的前面。
11. 如下代码输出什么? 写出作用域链查找过程伪代码
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
结果:
10
12. 如下代码输出什么? 写出作用域链查找过程伪代码
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
结果:
30
13. 以下代码输出什么? 写出作用域链的查找过程伪代码
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
结果:
30
14. 以下代码输出什么? 写出作用域链查找过程伪代码
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)
undefined
5
1
6
20
200