函数

2016-08-18  本文已影响0人  小周师傅

1.函数声明和函数表达式有什么区别 (*)

1.函数声明必须有标识符,也就是常说的函数名;函数表达式可以省略函数名。

函数声明

function functionName(arg1.arg2){
//to do
}

函数表达式

var variable=function(arg1,  arg2, ...){
//to do
}
var variable=function functionName(arg1, arg2, ...){
//to do
} 

2.函数声明会提前,函数表达式什么时候遇到什么时候执行

callName();
function callName(){
    console.log("my name is xxx");
}
callName();
var callName=function(){
    console.log("my name is xxx")
};

上面的第一种函数调用方法是正确的,可以输出my name is xxx,因为函数调用语句可以放在函数声明之后。而上面的第二种函数调用的方法是不能输出my name is xxx的。

2.什么是变量的声明前置?什么是函数的声明前置 (**)

sayHi();
function sayHi() {
    console.log("hi");
}
var a; // 声明一个变量,标识符为a
function a() { // 声明一个函数,标示符也为a
}
alert(typeof a);//显示结果“function”
function a() {
}
var a;
alert(typeof a);//显示结果function

声明a时同时赋值:

function a() {
}
var a = 1; // 此处有赋值
alert(typeof a);//显示“number”而不是“function”

如果把var声明语句放在最上面,结果也是一样的:

var a = 1; //  此处有赋值
function a() {
}
alert(typeof a);//显示“number”

3.arguments 是什么 (*)

1.JS中,arguments实际上是当前函数的一个内置属性, 和数组很像,但函数的 arguments 对象并不是一个数组,arguments变量有且只有一个length属性,Array的方法,例如push、pop 等,它并不具备,它只是一个“伪数组”,访问单个参数的方式与访问数组元素的方式相同。
在JS中,不需要明确指出参数名,就能访问他们:

function callName(){
if(arguments[0]=="lisa"){
    return;
}
console.log(arguments[0];
}

2.arguments对象的长度——arguments.length为函数实参个数
3.JS中没有重载函数的功能,但是arguments 对象能够模拟重载。
4.arguments.callee返回此arguments对象所在的当前函数引用。在使用函数递归调用时推荐使用arguments.callee代替函数名本身。

4.函数的重载怎样实现 (**)

JS中先定义的函数会被后定义的函数覆盖,想要实现函数的重载,可以借助arguments的length属性,检测参数个数,模拟函数重载。例子如下:

function doMath(){
    if (arguments.length == 1){
         console.log(arguments[0]);
    }
    else if(arguments.length ==2){
         console.log(arguments[0]*arguments[1]);
    }
}
doMath(2);
doMath(4,8);

5.立即执行函数表达式是什么?有什么作用 (***)

立即执行函数是一种语法,可以让你的函数在定以后立刻被执行,例如:

//创建一个函数表达式立刻执行
//写法一
(function(){
console.log("hellow");
}());
//写法二
(function(){
console.log("hellow");
})();

作用:

6什么是函数的作用域链 (****)

代码

1.以下代码输出什么? (难度**)

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('男');

2写一个函数,返回参数的平方和?如 (难度**)

  function sumOfSquares() {
            for (var s = 0, i = 0; i < arguments.length; i++) {
             s=s+arguments[i]*arguments[i]
            }
            console.log(s);
        }
        sumOfSquares(2, 3, 4); // 29
        sumOfSquares(1, 3); // 10

3.如下代码的输出?为什么 (难度*)

console.log(a);//undefined    变量提升
 var a = 1;
 console.log(b);//报错     变量b没有声明

4.如下代码的输出?为什么 (难度*)

sayName('world');//hello  world      函数声明提升
 sayAge(10);//报错     函数表达式不能提升
 function sayName(name){
     console.log('hello ', name); 
}
 var sayAge = function(age){
    console.log(age); 
};

5.如下代码的输出?为什么 (难度**)

function fn(){} 
var fn = 3; 
console.log(fn);//3
/*过程可以看做是:
var fn;
function fn(){};
fn = 3;/*在同一个作用域内定义了名字相同的变量和方法,变量的赋值会覆  盖方法的赋值*/
console.log(fn);
*/

6.如下代码的输出?为什么 (难度***)

function fn(fn2){
    console.log(fn2);
    var fn2 = 3;
    console.log(fn2);
    console.log(fn);
    function fn2(){
        console.log('fnnn2');
    }
} 
fn(10);

结果如下:

代码相当于:

function fn(fn2){
    var fn2;//变量声明提升
   function fn2(){
        console.log('fnnn2');
    }//函数声明提升
    console.log(fn2);
    fn2 = 3;
    console.log(fn2);
    console.log(fn);  
} 
fn(10);

7.如下代码的输出?为什么 (难度***)

var fn = 1;
 function fn(fn){
      console.log(fn);
 } 
console.log(fn(fn));

代码相当于:

var fn ;
function fn(fn){
    console.log(fn); 
}; 
fn = 1;
 console.log(fn(fn)); //报错 fn is not a function
/* 
同一个作用域中,定义同一个名字的变量和方法时,变量赋值会覆盖方法的赋值,此时解析器并不能够识别fn为函数,但打印时又以函数的方式打印,因此报错
*/

8.如下代码的输出?为什么 (难度**)

//作用域
 console.log(j);//undefined
 console.log(i); //undefined
for(var i=0; i<10; i++){
       var j = 100; 
} 
console.log(i); //10
console.log(j);//100

9.如下代码的输出?为什么 (难度****)

fn();
 var i = 10;
 var fn = 20;
 console.log(i);//10
 function fn(){
       console.log(i);//undefined 
       var i = 99;
       fn2();
       console.log(i);//100 
       function fn2(){
          i = 100; 
     } 
}

10.如下代码的输出?为什么 (难度*****)

var say = 0;
 (function say(n){
     console.log(n);/*10,9,8,7,6,5,4,3,2  立即执行函数,n=2时,满足2<3,跳出循环*/
     if(n<3) return;
     say(n-1);
 }( 10 ));
 console.log(say);//0  变量say已经赋值为0
上一篇 下一篇

猜你喜欢

热点阅读