函数声明和函数表达式有什么区别
函数声明
//函数声明
function sayHello(){
console.log('hello')
}
//函数调用
sayHello()
声明不必放到调用的前面
函数表达式
var sayHello = function(){
console.log('hello');
}
sayHello()
声明必须放到调用的前面
什么是变量的声明前置?什么是函数的声明前置?
声明前置是将变量、函数的声明放此变量、函数所在作用域的开头部分。
arguments 是什么
arguments是一个类数组对象。代表传给一个function的参数列表。
可以在函数内部通过使用 arguments 对象来获取函数的所有参数。这个对象为传递给函数的每个参数建立一个条目,条目的索引号从0开始。它包括了函所要调用的参数。object对象。类数组。
function printInfo( name, age, sex ){
console.log( name );
console.log( age );
console.log( sex );
console.log( arguments[0] ); // 打出来的是name
}
函数的"重载"怎样实现
首先,要明确,在JS中,没有重载。同名函数会覆盖。但可以在函数体针对不同的参数调用执行相应的逻辑。
function printPeopleInfo(name, age, sex){
if(name){
console.log(name);
}
if(age){
console.log(age);
}
if(sex){
console.log(sex);
}
}
printPeopleInfo('Byron', 26);//Byron 26
printPeopleInfo('Byron', 26, 'male');//Byron 26 male
立即执行函数表达式是什么?有什么作用
(function fn1(){
var a = 1;
})()
作用: 隔离作用域。
JavaScript有很多致命缺陷,比如JavaScript中没有命名空间,而且只有function代码块内部可以隔离变量作用域,自调用匿名函数就用来防止变量弥散到全局,以免各种js库冲突。
求n!,用递归来实现
function mul(a) {
if (a < 0)
return;
if (a == 0)
return 1;
{
return a * mul(a - 1);
}
}
console.log(mul(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, '男');
getInfo('小谷', 3);
getInfo('男');
执行结果:
getInfo('饥人谷', 2, '男');
输出:
name: 饥人谷
age: 2
sex: 男
{0:'valley', 1: 2, 2: '男'}
name valley
getInfo('小谷', 3);
输出:
name: 小谷
age: 3
sex: undefined
{0:'valley', 1: 3}
name valley
getInfo('男');
输出:
name: 男
age: undefined
sex: undefined
{0:'valley'}
name valley
写一个函数,返回参数的平方和?
function sumOfSquares() {
var sum = 0;
for (var i = 0; i < arguments.length; i++)
{
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
如下代码的输出?为什么
console.log(a);
var a = 1;
console.log(b);
输出结果:undefined
Uncaught ReferenceError: b is not defined
解析:console.log(a)的时候虽然a声明前置,但是并未赋值,所以这时候a的值是undefined,console.log(b)的时候,b没有定义,所以是报错。
如下代码的输出?为什么
sayName('world');//hello world 函数声明前置,可以随意调用
sayAge(10);//报错,因为此函数必须必须在其函数表达式之后调用
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
}
;
如下代码输出什么? 写出作用域链查找过程伪代码
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
输出结果:10
调用过程:
////
1. globalContext = {
AO: {
x: 10;
foo:function
bar:function
}
foo.[[scope]] = globalContext.AO
bar.[[scope]] = globalContext.AO
}
2.调用bar() barContext = {
AO:{
x:30;
}
scope:bar.[[scope]] = globalContext.AO
}
3.调用foo() fooContext = {
AO:{}
scope:foo.[[]scope] =globalContext.AO
}
如下代码输出什么? 写出作用域链查找过程伪代码
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
运行结果:30
调用过程
////////////
1. globalContext = {
AO: {
x: 10;
bar:function
}
bar.[[scope]] = globalContext.AO
}
2.调用bar() barContext = {
AO:{
x:30;
foo:function
}
scope:bar.[[scope]] = globalContext.AO
scope:foo.[[scope]] = barContext.AO
}
3.调用foo() fooContext = {
AO:{}
scope:foo.[[]scope] =barContext.AO
}
以下代码输出什么? 写出作用域链的查找过程伪代码
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
输出结果:30
调用过程:
//////
1. globalContext = {
AO: {
x: 10;
bar:function
}
bar.[[scope]] = globalContext.AO
}
2.调用bar() barContext = {
AO:{
x:30;
匿名:function
}
scope:bar.[[scope]] = globalContext.AO
scope:匿名.[[scope]] = barContext.AO
}
3.调用匿名函数() 匿名Context = {
AO:{}
scope:匿名函数.[[scope]] =barContext.AO
}
以下代码输出什么? 写出作用域链查找过程伪代码
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
调用过程:
///////
1. globalContext {
AO: {
a: 200;
fn: function
fn3: function
}
Scope: null;
fn.[[scope]]=globalContext.AO
fn3.[[scope]]=globalContext.AO
}
2. 调用fn()
fnContext{
AO:{
a:20
fn2:function
}
fn.[[scope]]=globalContext.AO
fn2.[[scope]]=fnContext.AO
}
3. 调用fn3()
fn3Context{
AO:{}
fn3.[[scope]]=globalContext.AO
}
4. 调用fn2()
fn2Context{
AO:{}
fn2.[[scope]]=fnContext.AO
}
网友评论