1.函数声明和函数表达式有什么区别
函数声明:声明不必放调用的前面;
函数表达式:声明必须放调用的前面。
2.什么是变量的声明前置?什么是函数的声明前置
变量的声明前置: JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到当前作用域的头部。如下:
console.log(a);
var a = 3;
console.log(a);
//经声明前置变为
var a;
console.log(a) // undefined
a = 3
console.log(a) // 3
函数的声明前置:JavaScript引擎将函数名视同变量名,所以采用function声明函数时,整个函数会像var声明变量一样,被提升到当前作用域的头部。如下:
sayHello();
function sayHello(){
console.log('hello');
}
//经声明前置变为
function sayHello(){
console.log('hello');
}
sayHello(); // 'hello'
3.arguments
是什么
arguments
是一个类似数组的对象, 对应于传递给函数的参数。在函数内部,你可以使用arguments
对象获取到该函数的所有传入参数。如下:
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
}
4.函数的"重载"怎样实现
重载是函数具有相同的名字,但是由于传入的参数不同,执行不同操作。在js中没有类似其他语言的重载,因为同名函数会被覆盖。但是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');
5.立即执行函数表达式是什么?有什么作用
表达式:
(function(){
var a = 1;
})()
console.log(a); //undefined
作用:隔离作用域。
6.求n!,用递归来实现
function factor(n) {
if (n === 1){
return 1;
}
return n = 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, '男');
//name:饥人谷;
age:2;
sex:男;
['饥人谷',2,'男'];
name valley;
getInfo('小谷', 3);
//name:小谷;
age:3;
sex:undefined;
['小谷',3];
name valley;
getInfo('男');
//name:男;
age:undefined;
sex:undefined;
['男'];
name valley;
8.写一个函数,返回参数的平方和?
function sumOfSquares(){
var sum = 0
for(i=0;i<arguments.length;i++){
sum = sum + Math.pow(arguments[i],2);
}
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); // 1
var a = 1;
console.log(b); //Uncaught ReferenceError: b is not defined,因为b没有声明。
10.如下代码的输出?为什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
输出:
hello world;
//函数声明 声明可以不用放在调用的前面。
sayAge is not a function
//函数表达式 声明必须放在调用的前面。
11如下代码输出什么? 写出作用域链查找过程伪代码
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
//输出:10
伪代码:
globalContext {
AO{
x:10
foo:function
bar:function
}
Scope=null
foo.[[scope]] = globalContext.AO
bar.[[scope]] = globalContext.AO
}
barContext {
AO{
x:30
}
Scope = globalContext.AO
}
fooContext {
AO{
}
Scope = globalContext.AO
}
12. 如下代码输出什么? 写出作用域链查找过程伪代码
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
//输出:30
伪代码:
globalContext{
AO{
x:10
bar:function
}
Scope = null
bar.[[scope]] = globalContext.AO
}
barContext{
AO{
x = 30
foo:function
}
Scope = globalContext.AO
foo.[[scope]] = barContext.AO
}
fooContext{
AO{
}
Scope = barContext.AO
}
13. 以下代码输出什么? 写出作用域链的查找过程伪代码
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
//输出:30
伪代码:
globalContext{
AO{
x:10
bar:function
}
Scope = null
bar.[[scope]] = globalContext.AO
}
barContext{
AO{
x = 30
立即执行函数:function
}
Scope = globalContext
立即执行函数.[[scope]] = barContext.AO
}
立即执行函数Context{
AO{
}
Scope = barContext.AO
}
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
伪代码:
globalContext{
AO{
a:1 200
fn:function
fn3:function
}
Scope = null
fn.[[scope]] = globalContext.AO
fn3.[[scope]] = globalContext.AO
}
fnContext{
AO{
x = 5 6 20
fn2:function
}
Scope = globalContext.AO
fn2.[[scope]] = fnContext.AO
}
fn3Context{
AO{
}
Scope = globalContext.AO
}
fn2Context{
AO{
}
Scope = fnContext.AO
}
//undefined 5 1 6 20 200